413 字
2 分钟
Systemd 深度解析:Linux 进程的守护神

为什么 nohup 不靠谱?#

最近我的交易机器人总是在深夜莫名其妙地消失(Process Died)。 我用的是 nohup python bot.py &。 这看起来很潇洒,但实际上很脆弱。 内存溢出?OOM Killer 会杀掉它。 服务器重启?它不会自动随系统启动。 网络抖动导致异常退出?它就永远睡过去了。

对于生产环境的服务,我们需要一个保姆。 在 Linux 世界,这个保姆就是 Systemd

Systemd 的核心:Unit 文件#

一个标准的服务配置 (/etc/systemd/system/trading-bot.service) 长这样:

[Unit]
Description=High Frequency Trading Bot
After=network.target
[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/bot
ExecStart=/home/ubuntu/bot/venv/bin/python strategy_sma.py
Restart=always
RestartSec=5
StandardOutput=append:/var/log/bot.log
StandardError=append:/var/log/bot.error.log
[Install]
WantedBy=multi-user.target

关键指令解析#

1. Restart=always#

这是最重要的一行。无论你的脚本是因为 Bug 崩了,还是被系统杀掉了,Systemd 都会尝试重启它。 就像一个永不放弃的教练:“站起来!比赛还没结束!”

2. RestartSec=5#

给它 5 秒钟喘息时间。防止程序陷入“崩溃-重启-崩溃”的死循环(Start Limit Burst),导致服务器 CPU 飙升。

3. After=network.target#

告诉 Systemd:“等网通了再叫我。” 很多联网程序启动失败,就是因为起得太早,网卡还没准备好。

进阶技巧:Watchdog#

如果程序没挂,但是死锁了(卡住不动)怎么办? Systemd 提供了看门狗机制。 你的程序需要定期向 Systemd 发送 sd_notify("WATCHDOG=1")。 如果 Systemd 在指定时间内没收到“汪汪”声,它就会判定程序已死,并强制重启。

[Service]
WatchdogSec=30s

结论#

别再用 nohup 了。给你的代码一个温暖的家(Service 文件),让 Systemd 来守护它的生生世世。

Systemd 深度解析:Linux 进程的守护神
https://www.oferry.com/posts/a43/
作者
晨平安
发布于
2026-02-07
许可协议
CC BY-NC-SA 4.0
封面
示例歌曲
示例艺术家
封面
示例歌曲
示例艺术家
0:00 / 0:00