ubuntu开机脚本不生效,90%是因为没搞清启动时机和执行上下文——systemd服务默认在用户登录前运行,而脚本可能依赖桌面环境、display变量或当前用户的$home路径;需确认脚本能独立运行,使用绝对路径手动执行验证,首行shebang必须有效,所有路径写死为绝对路径,推荐用systemd配置(服务文件放/etc/systemd/system/下,显式设user=、workingdirectory=、execstart=并重载配置),失效时优先查systemctl status和journalctl日志。

Ubuntu开机脚本不生效,90%是因为没搞清启动时机和执行上下文——systemd 服务默认在用户登录前运行,而你的脚本可能依赖桌面环境、DISPLAY 变量或当前用户的 $HOME 路径。
确认脚本本身能独立运行
别跳过这步。很多“不生效”其实是脚本根本跑不起来。
- 用绝对路径手动执行一次:
/usr/bin/bash /home/ubuntu/scripts/boot-task.sh - 检查是否报错:
echo $?返回非0就说明脚本有语法错误、路径不存在或权限不足 - 脚本首行必须是有效的 shebang,比如
#!/bin/bash或#!/usr/bin/env python3,不能是#!/bin/sh却用了 bash 特有语法(如[[ ]]) - 所有路径写死为绝对路径:不要用
~/scripts或./data,换成/home/ubuntu/scripts和/home/ubuntu/scripts/data
用 systemd 设置开机自启(推荐且最稳)
这是 Ubuntu 16.04+ 的标准方式,支持日志追踪、依赖控制和自动重启。
PostgreSQL 18.4 官方 Ubuntu 安装包现已发布,这是目前最新的稳定版本。推荐通过官方 APT 仓库安装:先执行 sudo apt update 更新索引,再运行 sudo apt install postgresql-18 即可完成部署。新版本引入了异步 I/O 子系统,在顺序扫描与 VACUUM 场景下性能提升显著,同时支持 UUID v7 原生生成函数与虚拟生成列。
- 服务文件必须放在
/etc/systemd/system/下,例如:sudo nano /etc/systemd/system/myboot.service -
User=字段决定运行身份:填ubuntu表示以普通用户运行;留空或写root则以系统权限运行(不推荐,除非真需要) -
WorkingDirectory=必须显式设置,否则脚本里cd ..或open("config.json")会失败 -
ExecStart=推荐显式调用解释器:/usr/bin/bash /home/ubuntu/scripts/boot-task.sh,而不是直接写脚本路径(systemd 不会自动读 shebang) - 启用后必须重载配置:
sudo systemctl daemon-reload,否则enable没用
常见失效原因与对应检查点
脚本写了、服务启了、也 reboot 了,还是没反应?先看这几处。
-
systemctl status myboot.service—— 看Active:是inactive (dead)还是failed,失败时末尾会提示具体错误行 -
journalctl -u myboot.service -n 50 --no-pager—— 查看最近 50 行真实输出,比盲猜靠谱得多 - 如果脚本要弹窗、发通知或操作 GUI 程序,
User=设对了还不够,还得加Environment=DISPLAY=:0和Environment=XAUTHORITY=/home/ubuntu/.Xauthority(仅限桌面环境) - 脚本里用了
sleep 5等待网络?不如改用After=network-online.target+Wants=network-online.target,更可靠 - Ubuntu 桌面版默认启用
systemd-user,但/etc/systemd/system/下的服务属于系统级,不会受用户 session 影响——这点常被误认为“只在登录后才运行”
真正容易被忽略的是:systemd 服务启动时,$PATH 是最小集(通常只有 /usr/bin:/bin),你写的命令如果装在 /opt/myapp/bin/,必须写全路径,或者在 service 文件里加 Environment=PATH=/opt/myapp/bin:/usr/local/bin:/usr/bin:/bin。










