linux服务自启首选systemd,需编写/etc/systemd/system/myapp.service文件,含unit[install]三部分,配置后执行daemon-reload和enable--now;次选rc.local或@reboot cron,但稳定性较差。

Linux 服务器服务自启配置,核心是让程序在系统启动后自动运行且稳定可控。现代主流发行版(Ubuntu 16.04+/CentOS 7+)统一使用 systemd,它比旧方式更可靠、可监控、易管理。实际配置不复杂,但关键细节容易出错。
用 systemd 写服务自启(推荐首选)
这是最规范、生产环境通用的方式。本质是写一个 .service 文件,告诉 systemd 如何启动、重启、日志和依赖。
- 在
/etc/systemd/system/下新建文件,比如myapp.service - 内容结构分三块,每块作用明确:
[Unit]
描述服务用途和启动顺序 `Description=My Python Backend` `After=network.target` ← 确保网络就绪后再启动(对需联网的服务很关键) `Wants=multi-user.target` ← 常规服务一般加这行就够了[Service]
定义怎么运行这个程序 `Type=simple` ← 大多数脚本或前台进程用这个 `User=www-data` ← 切忌用 root,应指定普通用户 `WorkingDirectory=/opt/myapp` ← 必须写绝对路径,否则可能找不到配置或数据文件 `ExecStart=/usr/bin/python3 /opt/myapp/app.py` ← 启动命令,路径全写死 `Restart=on-failure` ← 进程崩溃时自动拉起(关键!) `RestartSec=3` ← 重启前等 3 秒,避免频繁失败打满日志[Install]
声明何时启用该服务 `WantedBy=multi-user.target` ← 表示系统进入多用户模式(即正常登录态)时自动启动保存后执行三步:sudo chmod 644 /etc/systemd/system/myapp.servicesudo systemctl daemon-reload ← 让 systemd 重新读取配置sudo systemctl enable --now myapp.service ← 启用开机自启,并立即启动一次
查状态用 systemctl status myapp,看日志用 journalctl -u myapp -f
用 /etc/rc.local(适合简单命令)
如果只是几行 shell 命令(如挂载磁盘、启一个 nohup 后台程序),rc.local 更快上手,但得注意兼容性。
编辑
/etc/rc.local(若不存在可新建)开头加
#!/bin/bash,末尾必须有exit 0所有命令写绝对路径,例如:
/bin/mount /dev/sdb1 /data/usr/bin/nohup /usr/bin/python3 /home/user/script.py >> /var/log/script.log 2>&1 &赋予执行权限:
sudo chmod +x /etc/rc.localUbuntu 18.04+ 还要启用配套 service:
sudo systemctl enable rc-localsudo systemctl start rc-local
用 crontab @reboot(轻量临时方案)
适合测试或单次任务,不建议用于长期服务(缺少进程托管、无自动重启)。
- 运行
sudo crontab -e(用 root 的 crontab,避免权限问题) - 加一行:
@reboot /usr/bin/python3 /opt/app/start.py >> /var/log/app_boot.log 2>&1 - 注意:脚本里如有网络依赖,建议开头加
sleep 10等待网络就绪
不复杂但容易忽略:路径必须绝对、用户权限要匹配、后台程序必须加 & 或 nohup,否则会卡住系统启动。











