中转服务使用systemd托管,自动重启、崩溃重启
使用 systemd 托管中转服务,是目前 Linux 服务器上最稳妥的守护方式。
本文会带你从零配置一个可自动重启、崩溃恢复并带日志轮转的中转服务,全程无需安装第三方进程管理工具,适合刚接触服务器运维或正在处理服务频繁挂掉的用户。
完成后,服务会像 Nginx、MySQL 一样由 systemd 统一管理,异常退出后自动拉起,日志也不会无限增长。
为什么优先选择 systemd 托管
中转服务通常常驻后台,如果直接用 nohup 启动,进程一旦崩溃不会自动恢复,服务器重启后也不会自动运行。
systemd 作为系统级服务管理工具,能监控进程状态、按策略重启,并与系统启动流程无缝对接。
配置得当后,可以做到:
- 崩溃后自动重启,间隔可控
- 开机自动启动,无需手动拉起
- 标准输出统一交给 journald,方便集中查看
- 配合 logrotate 做日志轮转,避免磁盘写满
第一步:准备服务相关文件
先把中转服务的可执行文件或启动命令准备好。
假设你的服务位于 /opt/relay/relay.py,执行用户是 www-data,启动命令为 python3 relay.py。
务必先手动启动一次,确认服务能正常运行,并记录端口和日志输出位置。
如果服务本身依赖环境变量,建议写进 systemd 单元文件,或使用 EnvironmentFile 指向一个配置文件。
第二步:编写 systemd 服务单元
创建服务配置文件:
sudo tee /etc/systemd/system/relay.service <<'EOF'
[Unit]
Description=Relay Transfer Service
After=network-online.target
Wants=network-online.target
[Service]
User=www-data
Group=www-data
WorkingDirectory=/opt/relay
ExecStart=/usr/bin/python3 /opt/relay/relay.py
Restart=always
RestartSec=3
StartLimitIntervalSec=0
[Install]
WantedBy=multi-user.target
EOF
重点参数说明:
Restart=always:进程非正常退出就自动拉起,包括崩溃、被杀等情况。RestartSec=3:拉起前等待 3 秒,避免频繁重启造成日志刷屏。StartLimitIntervalSec=0:关闭重启次数限制,防止 systemd 放弃恢复。After和Wants:确保网络就绪后再启动,避免依赖网络的服务启动失败。
第三步:启动并验证自动重启
重新加载 systemd 配置并启动服务:
sudo systemctl daemon-reload
sudo systemctl enable --now relay
查看运行状态:
sudo systemctl status relay
输出中看到 Active: active (running) 即表示正常。
下一步测试崩溃恢复:
sudo kill -9 <服务PID>
sleep 5
sudo systemctl status relay
如果服务能在几秒后重新回到 active (running),说明自动重启机制已经生效。
第四步:配置日志轮转
systemd 会把服务的标准输出收集到 journald,日志量过大会占用内存和磁盘。
建议将服务日志重定向到文件,再交给 logrotate 管理。
在 systemd 单元中加入:
StandardOutput=append:/var/log/relay/relay.log
StandardError=append:/var/log/relay/error.log
创建日志目录并设置权限:
sudo mkdir -p /var/log/relay
sudo chown -R www-data:www-data /var/log/relay
然后添加 logrotate 配置:
sudo tee /etc/logrotate.d/relay <<'EOF'
/var/log/relay/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
copytruncate
}
EOF
copytruncate 会在复制后清空原文件,避免服务继续写入已删除的文件句柄。
完成配置后可以手动测试:
sudo logrotate -d /etc/logrotate.d/relay
出现 rotating pattern 而没有报错,说明轮转规则能正常加载。
避坑指南与常见问题
服务反复重启却起不来,先看日志定位启动失败原因,而不是盲调参数:
sudo journalctl -u relay -n 50 --no-pager
注意 Restart=always 只负责拉起,不解决启动失败本身。
如果服务启动依赖远程数据库,建议把 RestartSec 调大到 10 并设置合理的超时时间。
日志文件权限不对会导致服务无法写入并反复重启。
通过 ls -l /var/log/relay 确认属主是否为 www-data,必要时执行 sudo chown www-data:www-data /var/log/relay/relay.log。
修改服务配置后必须执行 sudo systemctl daemon-reload,否则 systemd 仍按旧配置运行。
这个细节容易忽略,尤其在调整重启参数后没有生效时。
验证整体效果
完成以上配置后,建议连续测试:重启一次服务器,确认服务随系统自动启动;
手动 kill 进程,确认自动恢复;
再观察日志文件是否按天切分。
如果这三项都正常,说明中转服务已经具备稳定的托管能力。
后续遇到端口占用、执行权限、环境变量缺失等问题,都可以通过 journalctl 快速缩小排查范围。