确认初始化系统为systemd后,编写.service文件需匹配程序行为:type选simple或oneshot,execstart用绝对路径,设after=network.target、user和workingdirectory,启用前必须daemon-reload。

确认你的系统用的是 systemd
别跳过这步——很多“设了不生效”的问题,根源就是误判了初始化系统。执行:ps -p 1 -ocomm=,如果输出是 systemd,那就可以往下走;如果是 init 或 upstart,本文方法不适用(老系统请用 update-rc.d 或 chkconfig)。
写一个能跑通的 .service 文件
核心不是“照抄模板”,而是匹配你程序的真实行为。常见错误:脚本卡住、路径错、用户权限不对、没等网络就启动。
-
Type=simple:适合前台运行的脚本或二进制(比如/usr/bin/python3 /opt/myapp/main.py),systemd 把它当主进程管 -
Type=oneshot:适合只执行一次就退出的脚本(比如初始化配置),必须加RemainAfterExit=yes,否则 systemd 认为服务“已死” -
ExecStart必须用绝对路径,python3要写成/usr/bin/python3,./script.sh要写成/home/user/script.sh -
After=network.target比After=multi-user.target更稳妥,尤其你的程序要连网络或数据库时 - 如果脚本需要特定用户,请显式写上
User=yourusername,别依赖 root 默认行为
示例(保存为 /etc/systemd/system/myapp.service):
启科网络商城系统由启科网络技术开发团队完全自主开发,使用国内最流行高效的PHP程序语言,并用小巧的MySql作为数据库服务器,并且使用Smarty引擎来分离网站程序与前端设计代码,让建立的网站可以自由制作个性化的页面。 系统使用标签作为数据调用格式,网站前台开发人员只要简单学习系统标签功能和使用方法,将标签设置在制作的HTML模板中进行对网站数据、内容、信息等的调用,即可建设出美观、个性的网站。
[Unit] Description=My Python App After=network.target [Service] Type=simple User=deploy WorkingDirectory=/opt/myapp ExecStart=/usr/bin/python3 /opt/myapp/app.py Restart=always RestartSec=5 [Install] WantedBy=multi-user.target
启用前必须 reload,否则 enable 是假动作
改完 .service 文件后,systemd 不会自动感知。漏掉这步,systemctl enable 就只是建了个空链接,服务根本不会被加载。
- 先重载配置:
sudo systemctl daemon-reload - 再启用开机自启:
sudo systemctl enable myapp.service - 立刻测试是否能手动启动:
sudo systemctl start myapp.service,然后看状态:sudo systemctl status myapp.service - 如果报
Failed to start,别急着重启机器,先查日志:journalctl -u myapp.service -n 30 --no-pager
别信 /etc/rc.local 还能随便用
Ubuntu 20.04+、CentOS 8+ 默认已禁用 rc.local,即使你加了可执行权限、写了命令,系统启动时也大概率跳过它——这不是 bug,是 systemd 的设计取舍。
- 它没有依赖管理,
rc.local里调的命令可能比网络、磁盘还早执行,导致失败 - 它不提供重启策略、资源限制、日志聚合,出问题只能靠
tail -f盲猜 - 如果你真要用,得先手动启用:
sudo systemctl enable rc-local,且确保/etc/rc.local第一行是#!/bin/bash,末尾有exit 0
除非你维护一台明确锁定在 Ubuntu 16.04 或 CentOS 6 的旧设备,否则绕开 rc.local 是最省心的选择。









