当前位置: 首页 > news >正文

Ubuntu实现程序开机自动运行

systemd 是 Ubuntu 默认的初始化系统,适合长期运行的服务或脚本。

  1. 创建脚本: 假设你有一个需要自动运行的脚本,例如 /home/user/myscript.sh,确保脚本有执行权限:

    bash

    chmod +x /home/user/myscript.sh

  2. 创建 systemd 服务文件: 在 /etc/systemd/system/ 目录下创建一个服务文件,例如 myservice.service:

    bash

    sudo nano /etc/systemd/system/myservice.service

    添加以下内容(根据需要调整):

    ini

    [Unit]

    Description=My Auto Start Script

    After=network.target

    [Service]

    ExecStart=/home/user/myscript.sh

    Restart=always

    User=user # 替换为你的用户名

    Environment=DISPLAY=:0 # 如果需要 GUI 环境

    [Install]

    WantedBy=multi-user.target

  3. 启用服务

    bash

    sudo systemctl enable myservice.service

    sudo systemctl start myservice.service

  4. 检查状态

    bash

    sudo systemctl status myservice.service

[Unit]

Description=BridgeSysTask - 启动 Qt GUI 程序

After=network.target graphical.target

[Service]

ExecStart=/home/pi/BridgeSys/linux/arm64_d/runApp.sh

WorkingDirectory=/home/pi/BridgeSys/linux/arm64_d

Environment=DISPLAY=:0

Environment=XAUTHORITY=/home/pi/.Xauthority

Environment=QT_QPA_PLATFORM=xcb

Restart=always

RestartSec=5

User=pi

StandardOutput=journal

StandardError=journal

[Install]

WantedBy=graphical.target

变更说明

  • 替换 After=network.target 为 After=network.target graphical.target,确保图形界面加载完成。
  • 替换 WantedBy=multi-user.target 为 WantedBy=graphical.target。
  • 添加 Environment=DISPLAY=:0 和 XAUTHORITY=/home/pi/.Xauthority 以支持 X11。
  • 添加 QT_QPA_PLATFORM=xcb,与 runApp.sh 保持一致(也可移除,依赖脚本设置)。
  • 添加 StandardOutput=journal 和 StandardError=journal 以捕获日志。

保存后,重新加载并重启服务:

bash

sudo systemctl daemon-reload

sudo systemctl restart BridgeSysTask.service

2. 检查服务状态

查看服务状态以确认是否仍然失败:

bash

sudo systemctl status BridgeSysTask.service

检查详细日志:

bash

sudo journalctl -u BridgeSysTask.service -b

3. 验证 X11 环境

确认 X11 服务器运行:

bash

ps aux | grep Xorg

检查 XDG_SESSION_TYPE:

bash

echo $XDG_SESSION_TYPE

  • 如果输出为 x11,服务文件的 DISPLAY=:0 和 XAUTHORITY 配置应有效。
  • 如果输出为 wayland,QT_QPA_PLATFORM=xcb 可能导致问题。尝试移除服务文件和 runApp.sh 中的 QT_QPA_PLATFORM=xcb,或确保 X11 支持:

    bash

    sudo apt install xorg

确认 pi 用户的 .Xauthority 文件:

bash

ls -l /home/pi/.Xauthority

如果缺失,尝试以 pi 用户登录图形界面生成 .Xauthority。

4. 调试 runApp.sh 在 systemd 环境

手动模拟 systemd 环境运行脚本:

bash

sudo -u pi env DISPLAY=:0 XAUTHORITY=/home/pi/.Xauthority QT_QPA_PLATFORM=xcb /home/pi/BridgeSys/linux/arm64_d/runApp.sh

如果失败,检查输出错误,可能指向:

  • X11 连接问题(cannot connect to X server)。
  • 库加载问题(libQt5Core.so: cannot open shared object file)。
  • 程序内部错误(segmentation fault 或其他)。
5. 检查 BridgeSys_d 依赖

虽然手动运行正常,但 systemd 环境可能导致库加载问题。再次确认依赖:

bash

ldd /home/pi/BridgeSys/linux/arm64_d/BridgeSys_d

确保 LD_LIBRARY_PATH 中的路径有效:

bash

ls -l /home/pi/BridgeSys/linux/arm64_d/libs

ls -l /home/pi/BridgeSys/linux/arm64_d/plugins

6. 添加调试日志

修改 runApp.sh 以捕获更多信息:

bash

sudo nano /home/pi/BridgeSys/linux/arm64_d/runApp.sh

在 exec "$PRGDIR"/"$EXECUTABLE" 前添加:

bash

echo "Starting BridgeSys_d at $(date)" >> /home/pi/BridgeSysTask.log

exec "$PRGDIR"/"$EXECUTABLE" >> /home/pi/BridgeSysTask.log 2>&1

重启服务并检查日志:

bash

sudo systemctl restart BridgeSysTask.service

cat /home/pi/BridgeSysTask.log

7. 检查权限

确保 pi 用户对所有相关文件有权限:

bash

sudo chown -R pi:pi /home/pi/BridgeSys

sudo chmod -R u+rwX /home/pi/BridgeSys

8. 验证图形会话

systemd 服务可能在用户图形会话启动前运行,导致 X11 不可用。确保 pi 用户已登录图形界面,或尝试以用户级别服务运行:

bash

systemctl --user enable BridgeSysTask.service

为此,需将服务文件移到用户目录:

bash

mkdir -p ~/.config/systemd/user

mv /etc/systemd/system/BridgeSysTask.service ~/.config/systemd/user/

systemctl --user daemon-reload

systemctl --user start BridgeSysTask.service

解决步骤

1. 验证 X11 环境

确认系统是否使用 X11:

bash

echo $XDG_SESSION_TYPE

  • 如果输出为 x11
    • 检查 X 服务器是否运行:

      bash

      ps aux | grep Xorg

      如果没有 Xorg 进程,启动 X 服务器:

      bash

      startx &

    • 确认 .Xauthority 文件存在:

      bash

      ls -l /home/pi/.Xauthority

      如果缺失,登录图形界面生成:

      bash

      xauth generate :0 .

  • 如果输出为 wayland
    • runApp.sh 和服务文件中的 QT_QPA_PLATFORM=xcb 强制使用 X11,可能导致问题。尝试使用 Wayland 插件:
      1. 编辑 runApp.sh:

        bash

        sudo nano /home/pi/BridgeSys/linux/arm64_d/runApp.sh

        将 export QT_QPA_PLATFORM=xcb 改为:

        bash

        export QT_QPA_PLATFORM=wayland

      2. 编辑服务文件:

        bash

        sudo nano /etc/systemd/system/BridgeSysTask.service

        将 Environment=QT_QPA_PLATFORM=xcb 改为:

        ini

        Environment=QT_QPA_PLATFORM=wayland

        或完全移除此行,依赖脚本设置。
      3. 重新加载并重启服务:

        bash

        sudo systemctl daemon-reload

        sudo systemctl restart BridgeSysTask.service

2. 测试 systemd 环境

模拟 systemd 环境运行脚本,验证 X11 配置:

bash

sudo -u pi env DISPLAY=:0 XAUTHORITY=/home/pi/.Xauthority QT_QPA_PLATFORM=xcb /home/pi/BridgeSys/linux/arm64_d/runApp.sh

  • 如果失败,记录具体错误。
  • 如果成功,说明服务文件配置可能仍不完整。
3. 检查 X11 依赖

确保 X11 相关库已安装:

bash

sudo apt update

sudo apt install libqt5xcbqpa5 libxcb-xinerama0 libxcb-xinput0 libx11-xcb1 xorg

检查 BridgeSys_d 的依赖:

bash

ldd /home/pi/BridgeSys/linux/arm64_d/BridgeSys_d

如果有 not found 的库,安装缺失依赖:

bash

sudo apt install libxcb1 libxcb-xfixes0 libxcb-shape0

4. 确保图形界面已启动

After=graphical.target 要求图形界面加载完成。确认显示管理器运行:

bash

sudo systemctl status display-manager

如果未运行,启用并启动:

bash

sudo systemctl enable display-manager

sudo systemctl start display-manager

常用显示管理器包括 lightdm 或 gdm3,确认安装:

bash

sudo apt install lightdm

5. 运行用户级服务

系统服务可能在用户图形会话启动前运行,导致 X11 不可用。尝试以 pi 用户的 systemd 用户服务运行:

bash

mkdir -p ~/.config/systemd/user

cp /etc/systemd/system/BridgeSysTask.service ~/.config/systemd/user/

编辑用户服务文件,移除 User=pi(用户服务默认以当前用户运行):

bash

nano ~/.config/systemd/user/BridgeSysTask.service

确保内容为:

ini

[Unit]

Description=BridgeSysTask - 启动 Qt GUI 程序

After=network.target graphical.target

[Service]

ExecStart=/home/pi/BridgeSys/linux/arm64_d/runApp.sh

WorkingDirectory=/home/pi/BridgeSys/linux/arm64_d

Environment=DISPLAY=:0

Environment=XAUTHORITY=/home/pi/.Xauthority

Environment=QT_QPA_PLATFORM=xcb

Restart=always

RestartSec=5

StandardOutput=journal

StandardError=journal

[Install]

WantedBy=graphical.target

启用并启动用户服务:

bash

systemctl --user daemon-reload

systemctl --user enable BridgeSysTask.service

systemctl --user start BridgeSysTask.service

检查状态:

bash

systemctl --user status BridgeSysTask.service

6. 捕获详细日志

修改 runApp.sh 添加日志:

bash

sudo nano /home/pi/BridgeSys/linux/arm64_d/runApp.sh

在 exec "$PRGDIR"/"$EXECUTABLE" 前添加:

bash

echo "Starting BridgeSys_d at $(date)" >> /home/pi/BridgeSysTask.log

exec "$PRGDIR"/"$EXECUTABLE" >> /home/pi/BridgeSysTask.log 2>&1

重启服务并检查日志:

bash

sudo systemctl restart BridgeSysTask.service

cat /home/pi/BridgeSysTask.log

7. 禁用 Wayland(如果适用)

如果 XDG_SESSION_TYPE 为 wayland 且无法切换到 Wayland 插件,强制系统使用 X11:

  • 编辑显示管理器配置(例如 lightdm):

    bash

    sudo nano /etc/lightdm/lightdm.conf

    添加或修改:

    ini

    [Seat:*]

    session-type=x11

  • 重启显示管理器:

    bash

    sudo systemctl restart lightdm


下一步

请执行以下步骤并提供结果:

  1. 检查 XDG_SESSION_TYPE:

    bash

    echo $XDG_SESSION_TYPE

  2. 运行模拟 systemd 环境的命令:

    bash

    sudo -u pi env DISPLAY=:0 XAUTHORITY=/home/pi/.Xauthority QT_QPA_PLATFORM=xcb /home/pi/BridgeSys/linux/arm64_d/runApp.sh

  3. 检查 .Xauthority 文件:

    bash

    ls -l /home/pi/.Xauthority

  4. 检查服务状态和日志:

    bash

    sudo systemctl status BridgeSysTask.service

    sudo journalctl -u BridgeSysTask.service -b

  5. 如果尝试用户服务,运行:

    bash

    systemctl --user status BridgeSysTask.service

http://www.lryc.cn/news/627063.html

相关文章:

  • Windows 如何清理右键菜单?电脑桌面右键菜单里出现一个清理内存 怎么去掉?
  • 强制重启导致Ubuntu24.04LTS amd的WIFI无法使用的解决方案
  • 电芯自动分选装盒机:高效整合分选与包装的智能化解决方案
  • unfold 切图像,图形transformer的切割操作
  • 【蒸蒸日上】军八武将篇——标1
  • 仿真驱动的AI自动驾驶汽车安全设计与测试
  • 30.Linux cobbler自动化部署
  • 计算机网络基础复习
  • 对象存储 COS 端到端质量系列——终端 COS SDK 网络优化
  • 【自记】Power BI 中 ALL、ALLSELECTED、ALLEXCEPT、ALLNOBLANKROW 的区别说明
  • Python打卡Day47 注意力热图可视化
  • 分享一个基于spark大数据的海洋塑料污染监测与可视化分析系统 基于Python的海洋塑料污染数据交互式可视化分析系统
  • Qwen Image edit的ComfyUI工作流搭建
  • 2025招商铸盾车联网CTF竞赛初赛题解
  • IT运维背锅权限泄露?集中式管控如何化解风险?
  • Docker Compose命令一览(Docker Compose指令、docker-compose命令)
  • Javascript面试题及详细答案150道之(121-135)
  • Linux Capability 解析
  • 达梦数据库-实时主备集群部署详解(附图文)手工搭建一主一备数据守护集群DW
  • Java 通过 m3u8 链接下载所有 ts 视频切片并合并转换为 mp4 格式
  • 齐次线性方程组最小二乘解
  • 接美国血统(中序、后序→前序)
  • 【网络运维】Linux:正则表达式
  • 虚幻引擎目录结构
  • AGV小车cad+三维图+设计说明书
  • C++ 力扣 438.找到字符串中所有字母异位词 题解 优选算法 滑动窗口 每日一题
  • Java 线程池ThreadPoolExecutor源码解读
  • 服务器内存条不识别及服务器内存位置图
  • linux的sysctl系统以及systemd系统。
  • 【网络运维】Linux 文本处理利器:sed 命令