Ubuntu 22.04 LTS桌面版配置.sh脚本开机自启动失败求助
Ubuntu 22.04 LTS桌面版配置.sh脚本开机自启动失败求助
看起来你为了让这个Chromium kiosk脚本开机自启动,试了好几种方法都碰壁了,我来帮你逐个排查问题,再给你靠谱的解决方案。
先说说你之前尝试里的几个坑:
1. Crontab方法的问题
你在crontab -e里加了@reboot root /usr/local/tiles.sh,这里有两个核心问题:
- 普通用户的crontab里不能加
root前缀,只有编辑root用户的crontab(sudo crontab -e)时才无需指定用户; - Crontab的运行环境非常精简,缺少桌面应用必需的X环境变量(比如
DISPLAY、XAUTHORITY),Chromium作为GUI程序根本没法在这种环境下启动,所以这个方法本身就不适合跑桌面程序。
2. .profile方法的问题
.profile是用户登录时才会执行的脚本,但它执行的时机太早——此时桌面环境可能还没完全初始化完成,Chromium找不到可用的X窗口,自然启动失败。另外,你写的sh /usr/local/tiles.sh其实没必要,只要脚本本身有执行权限,直接写/usr/local/tiles.sh就行,但核心问题还是时机不对。
3. Startup Application Preferences方法的问题
这个方法本身是适合桌面程序自启动的,但可能你漏了几个细节:
- 有没有给脚本加shebang头?也就是在
tiles.sh的第一行加上#!/bin/bash,否则系统可能不知道用什么解释器来运行它; - 有没有手动测试过脚本?先在终端里跑
/usr/local/tiles.sh,确认Chromium能正常启动,排除脚本本身的问题; - 如果还是不行,可以试试在Command里加上环境变量,比如写成
DISPLAY=:0 /usr/local/tiles.sh,强制指定X显示端口。
4. Systemd服务方法的问题
你的systemd服务配置有两个关键错误:
WantedBy=multi-user.target是命令行多用户环境的目标,桌面版应该用graphical-session.target,确保服务在桌面环境启动后再运行;- 没有指定运行服务的用户,桌面应用不能用root身份运行,需要加上X环境变量,让Chromium能找到窗口会话。
给你两个靠谱的解决方案(按简单程度排序)
方案一:修复Startup Application Preferences配置
这是最适合桌面程序的简单方法:
- 先完善你的
tiles.sh脚本:- 第一行加上
#!/bin/bash; - 把Chromium的命令改成完整路径(用
which chromium-browser可以查到路径,比如/usr/bin/chromium-browser),避免环境变量找不到命令; - 给脚本加执行权限:
chmod +x /usr/local/tiles.sh; - 手动运行脚本确认能正常启动Chromium:
/usr/local/tiles.sh。
- 第一行加上
- 打开「Startup Application Preferences」,点击「Add」:
- Name: Tiles
- Command:
/usr/local/tiles.sh(如果还是不行,改成DISPLAY=:0 /usr/local/tiles.sh) - Comment: 自定义备注即可
- 保存后重启系统测试。如果还是失败,可以在脚本开头加一行日志输出,方便排查:
重启后查看exec > /tmp/tiles_startup.log 2>&1/tmp/tiles_startup.log里的错误信息,就能知道具体哪里出问题了。
方案二:用Systemd用户服务(更稳定可控)
如果Startup Applications还是不行,可以用systemd用户服务,它会严格在桌面会话启动后再运行:
- 先按方案一的步骤完善好
tiles.sh脚本; - 创建用户服务文件:
mkdir -p ~/.config/systemd/user nano ~/.config/systemd/user/tiles.service - 粘贴以下内容:
[Unit] Description=Tiles Chromium Kiosk After=graphical-session.target [Service] Type=simple ExecStart=/usr/local/tiles.sh Restart=on-failure Environment=DISPLAY=:0 Environment=XAUTHORITY=%h/.Xauthority [Install] WantedBy=graphical-session.target - 执行以下命令启用并启动服务:
systemctl --user daemon-reload systemctl --user enable tiles.service - 重启系统测试,这个方法会在你登录桌面后自动启动Chromium,而且如果Chromium意外崩溃,还会自动重启。
备注:内容来源于stack exchange,提问作者rca




