中转服务使用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 放弃恢复。
  • AfterWants:确保网络就绪后再启动,避免依赖网络的服务启动失败。

第三步:启动并验证自动重启

重新加载 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 快速缩小排查范围。

分享到:
上一篇
Ollama禁止外网访问的几种正确配置方式
下一篇
sub2api会话池管理,维持大量网页账号会话减少
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意