systemd是现代ubuntu唯一可靠开机脚本管理方式,需将.service文件置于/etc/systemd/system/、设644权限、显式指定user/workingdirectory/after等参数,并执行daemon-reload后启用。

systemd 是现代 Ubuntu(16.04+,尤其是 20.04/22.04/24.04)唯一可靠、可调试、支持依赖和重启策略的开机脚本管理方式。别碰 rc.local,除非你明确知道它已被 systemd 禁用且需额外启用服务;也别依赖 @reboot cron,它不保证网络就绪、不捕获 stdout/stderr、失败后不重试。
怎么写一个能被 systemd 正确加载的 .service 文件
关键不是“写对语法”,而是让 systemd 能理解你的脚本在什么时机、以谁的身份、在哪种环境下运行。
-
After=和Wants=必须匹配实际依赖:比如脚本要访问网络,就得写After=network-online.target和Wants=network-online.target;若只是本地文件操作,After=local-fs.target更稳妥 -
User=建议显式指定(如User=ubuntu),避免默认以 root 运行——多数脚本不需要 root 权限,且日志、路径、环境变量更可控 -
WorkingDirectory=必须填绝对路径,否则./data.json会报 “No such file”;哪怕脚本里写了cd /home/ubuntu/myapp,systemd 仍以/为初始工作目录启动 -
Type=选对类型:Type=simple(前台进程,如 Python HTTP server);Type=forking(后台 daemon,如传统 shell 脚本末尾带&);Type=oneshot(只执行一次就退出,适合初始化类脚本) -
Restart=on-failure很实用,但必须配合RestartSec=5(秒级延迟),否则反复崩溃会触发 systemd 的速率限制
为什么脚本明明可执行,systemctl start 却报 Failed to start xxx.service: Unit xxx.service not found
这不是权限问题,也不是路径错,而是 systemd 没“看见”你新建的服务文件。
Ubuntu 26.04 LTS(代号“Resolute Raccoon”)是Canonical于2026年4月23日发布的下一代长期支持版操作系统,提供长达10年的技术支持。它搭载Linux 7.0内核与GNOME 50桌面环境,全面转向Wayland协议,并引入Rust重写的核心工具以增强安全性。官方提供适用于AMD64和ARM64架构的桌面及服务器ISO镜像,是追求前沿技术与极致稳定的开发者
- 服务文件必须放在
/etc/systemd/system/下(用户级服务放~/.config/systemd/user/需额外启用 user instance) - 文件名必须以
.service结尾,且不能含空格或特殊字符(如my script.service❌,my-script.service✅) - 改完文件后,**必须**运行
sudo systemctl daemon-reload,否则enable或start都无效 - 如果用
sudo systemctl enable my-script.service报 “no such file or directory”,先ls /etc/systemd/system/my-script.service确认文件真实存在
systemctl status 显示 active (exited) 但脚本没持续运行
这是 Type=oneshot 的典型表现——systemd 认为任务完成就结束了,不会守着进程。
- 如果你的脚本是循环监听(如
while true; do ...; sleep 10; done),必须用Type=simple,且确保脚本本身不后台化(删掉末尾的&) - 如果用了
&启动子进程又立即退出,systemd 会认为主进程结束,标记为exited,子进程变成孤儿——此时应改用Type=forking并配PIDFile=(不推荐,复杂易错) - 检查
StandardOutput=journal是否开启,然后用sudo journalctl -u my-script.service -n 50 -f实时看输出,常能发现脚本因路径错、权限不足或缺少环境变量而秒退 - 常见陷阱:
$PATH在 systemd 里极简(通常只有/usr/bin:/bin),调用python3没问题,但poetry或node可能找不到——统一用绝对路径,如/usr/local/bin/poetry run ...
sudo -u ubuntu /usr/bin/bash /path/to/script.sh),比反复改 .service 更快定位问题。










