用 & 或 nohup 跑应用,在服务器重启、进程崩溃、或你想找它的日志之前都没问题——然后就散架了。systemd 是标准答案:它开机启动你的应用、崩溃后重启、并捕获它的日志。把脚本或二进制变成受管服务,只需一个小文件。
1. 写一个 unit 文件
创建 /etc/systemd/system/myapp.service:
[Unit]
Description=My application
After=network.target
[Service]
User=myapp
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 /opt/myapp/run.py
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
把 ExecStart、WorkingDirectory 和 User 调整为你的应用。Restart=always 就是让它保持存活的东西。
2. 创建一个专用用户(推荐)
sudo useradd --system --no-create-home --shell /usr/sbin/nologin myapp
sudo chown -R myapp:myapp /opt/myapp
以非 root 用户运行,可在应用被攻破时限制损失。
3. 启用并启动它
sudo systemctl daemon-reload
sudo systemctl enable --now myapp
enable 让它开机启动;--now 立即启动它。
4. 检查状态和日志
sudo systemctl status myapp
journalctl -u myapp -f # 跟随实时日志
日常命令
sudo systemctl restart myapp # 修改后重启
sudo systemctl stop myapp # 停止它
sudo systemctl disable myapp # 取消开机自启
诚实的提醒
- 编辑 unit 文件后运行
daemon-reload,否则 systemd 用的是旧版本。 - 提防崩溃循环。 如果应用一启动就失败,
Restart=always会永远重试——RestartSec=5拉开重试间隔;通过日志修复根本错误。 - 首选非 root 的
User=,这样被攻破的应用不会拥有整台服务器。
下一步
systemd 服务就是你让任何东西 24/7 运行的方式——例如一个全天候运行的 AI 智能体,或自托管 RustDesk 服务器背后的中继。如果你的应用改用容器,Docker 的 --restart unless-stopped 扮演同样的角色——见如何安装 Docker。
评论
暂无评论。来做第一个吧。