EQVPS

如何创建 systemd 服务让应用持续运行

把任何脚本或应用变成受管服务:开机自启、崩溃后自动重启、日志写入 journalctl。写一个 unit 文件、启用它、检查状态——这是在 Linux 上让某样东西 24/7 运行的标准方式。

&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

ExecStartWorkingDirectoryUser 调整为你的应用。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   # 取消开机自启

诚实的提醒

下一步

systemd 服务就是你让任何东西 24/7 运行的方式——例如一个全天候运行的 AI 智能体,或自托管 RustDesk 服务器背后的中继。如果你的应用改用容器,Docker 的 --restart unless-stopped 扮演同样的角色——见如何安装 Docker

常见问题

为什么用 systemd 而不是直接把应用放到后台跑?

后台进程(用 & 或 nohup)在重启后就没了,崩溃后不会回来,日志也四散各处。systemd 服务会开机自启、失败后重启,并把输出送到 journalctl。这是在 Linux 上运行长期存活程序的标准、可靠方式。

unit 文件放在哪里?

你自己的服务放在 /etc/systemd/system/,每个服务一个文件,命名为 something.service。创建或编辑后,运行 'systemctl daemon-reload' 让 systemd 读取变更,然后启用并启动它。

'Restart=always' 有什么用,有没有坏处?

它告诉 systemd 无论服务因何退出都重启它——这是让某样东西保持运行的关键。唯一的隐患是崩溃循环:如果应用一启动就立刻失败,systemd 会不停重启它。加上 'RestartSec=5' 把重试间隔拉开,并查看日志修复根本错误。

怎么查看服务的日志?

用 'journalctl -u yourservice -f' 跟随实时输出,或去掉 -f 读取历史。systemd 会自动捕获 stdout 和 stderr,所以你不必自己接日志文件。

服务应该以 root 运行吗?

最好不要。创建一个专用的非 root 用户,并在 unit 里设置 'User=',这样应用被攻破也不会交出整台机器。只在服务确实需要时才以 root 运行。

评论

暂无评论。来做第一个吧。

发表评论

评论在显示前会经过审核。