最可靠的方式是用 systemd 创建服务单元文件:必须存于 /etc/systemd/system/ 目录下,后缀 .service,包含 [Unit](含 After=network.target)、[Service](ExecStart 用绝对路径、指定 Type 和 User)、[Install](WantedBy=multi-user.target)三段,并执行 daemon-reload、enable、start 及 journalctl 验证。

最可靠的方式是用 systemd 创建服务单元文件,把它变成系统认可的“标准服务”。这不只是让它开机跑,而是获得日志、依赖控制、失败重试和状态管理等完整能力。
写一个合法的 .service 文件
文件必须放在 /etc/systemd/system/ 目录下,后缀为 .service,内容至少包含三段:[Unit]、[Service]、[Install]。
-
[Unit] 中加
After=network.target,确保网络就绪后再运行;可选加Wants=network.target显式声明依赖 -
[Service] 中
ExecStart=必须写脚本的绝对路径,比如/usr/local/bin/myscript.sh;Type=按行为选:oneshot(执行完退出)、simple(常驻前台)、forking(后台 daemon);显式指定User=,避免默认 root 权限过大 -
[Install] 中
WantedBy=multi-user.target是通用选择,表示在多用户模式下启用
让脚本本身真正可用
很多失败不是配置错,而是脚本在 systemd 环境里跑不起来。systemd 的启动环境极简:没有完整 $PATH,不加载 shell 配置,也没有终端。
- 脚本里所有命令都用绝对路径,比如
/bin/bash、/usr/bin/python3、/usr/bin/curl - 如果要访问网络或远程服务,别靠 sleep 硬等,优先用
After=和Wants=声明依赖 - 加上
StandardOutput=journal和StandardError=journal,这样journalctl -u yourservice.service才能查到输出 - 给脚本加执行权限:
sudo chmod +x /usr/local/bin/myscript.sh
启用并验证服务
配置写完不能直接 enable,必须先让 systemd 重新读取。
- 执行
sudo systemctl daemon-reload—— 否则 enable 会静默失败或启用旧版本 - 检查语法是否合法:
sudo systemd-analyze verify /etc/systemd/system/myscript.service,有报错就别继续 - 启用开机自启:
sudo systemctl enable myscript.service - 立即测试:
sudo systemctl start myscript.service,再用journalctl -u myscript.service -n 30看日志
备选方案:/etc/rc.local(仅当 systemd 不适用时)
它兼容性强,适合旧系统或极简环境(如 Buildroot),但不属于“标准服务”,没有依赖管理和日志集成。
- 确保
/etc/rc.local存在且可执行:sudo chmod +x /etc/rc.local - 首行必须是
#!/bin/bash,命令加在exit 0之前 - 在 systemd 系统中还需启用配套服务:
sudo systemctl enable rc-local - 不推荐用于需要稳定环境或调试支持的场景


















