用 systemctl 实现自定义脚本开机自启,需将命名规范(.service 结尾)、权限 644 的服务文件置于 /etc/systemd/system/,填全 unit[install] 三段,正确设置 type、execstart 绝对路径、user、workingdirectory 及网络依赖;启用前必须 daemon-reload,再 enable 并 start 测试,配合 journalctl 查日志;需显式配置 restart=on-failure 和 restartsec=5 实现崩溃自启。

用 systemctl 让自定义脚本开机自启,核心是写对 .service 文件、放对位置、走完启用流程。不是写完就能跑,漏一步就白忙。
服务文件必须放对位置且命名规范
自定义服务文件只能放在 /etc/systemd/system/ 目录下,不能丢进 /lib/systemd/system/ 或自己建子目录——systemd 不扫描子目录,/lib 是软件包管理器专用路径,手动改会被覆盖。
- 文件名必须以
.service结尾,例如backup-job.service - 权限设为
644(sudo chmod 644 /etc/systemd/system/backup-job.service) - 编辑完必须立刻执行
sudo systemctl daemon-reload,否则enable会静默失败
配置内容要填全三段,关键字段不能错
一个有效服务文件至少包含 [Unit]、[Service]、[Install] 三段。常见错误集中在 Type 和 ExecStart:
-
Type=simple最常用,但要求ExecStart启动的是前台长期进程;脚本里不能写&、nohup ... &或执行完就exit -
ExecStart必须用绝对路径,比如/usr/bin/bash /opt/scripts/backup.sh,不能只写backup.sh - 加
User=指定运行用户,避免默认用 root;加WorkingDirectory=明确工作目录,防路径出错 - 依赖网络的脚本,
[Unit]段要写After=network.target和Wants=network.target
启用与验证必须分步操作,不能跳过
systemctl enable 只是让服务“下次开机启动”,它不启动服务本身,也不保证配置正确。完整流程如下:
- 重载配置:
sudo systemctl daemon-reload - 启用开机自启:
sudo systemctl enable backup-job.service(会在/etc/systemd/system/multi-user.target.wants/下建软链接) - 立即测试:
sudo systemctl start backup-job.service - 查状态:
sudo systemctl status backup-job.service看是否 active,退出码是否为 0 - 看日志:
sudo journalctl -u backup-job -n 50 --no-pager比tail /var/log/syslog更精准
让脚本崩溃后自动拉起,靠 Restart 策略
默认 Restart=no,即不重启。想实现守护效果,需主动配置:
-
Restart=on-failure:仅在非零退出码时重启(推荐用于多数脚本) -
RestartSec=5:每次重启前等待 5 秒,防无限崩溃循环 - 若脚本本身会 fork 出后台进程,要用
Type=forking并配PIDFile=,否则 systemd 无法跟踪主进程











