把脚本放后台跑,一关终端就没了。用 systemd 才是正经做法。
最小可用配置
[Unit]
Description=My Web App
After=network.target
[Service]
Type=simple
User=www
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 app.py
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
存到 /etc/systemd/system/myapp.service,然后:
systemctl daemon-reload
systemctl enable --now myapp # 开机自启 + 立即启动
几个关键选项
Restart=always:崩了自动拉起(on-failure只在非 0 退出时重启)User=:别用 root 跑EnvironmentFile=:放环境变量,别写死进命令StandardOutput=journal:日志交给 journald
常用命令
systemctl status myapp
journalctl -u myapp -f # 实时看日志
journalctl -u myapp --since today
三个坑
ExecStart里不要用 shell 管道和重定向,要用就得包sh -c- 程序必须在前台运行,自己 daemonize 后 systemd 会认为它退出了
- 改了
.service文件一定要daemon-reload才生效
排错:
systemd-analyze verify <文件>和journalctl -xe。
楼主 · 2026-09-28 14:37 · 浏览 6

