使用systemd 监控服务并实现故障自动重启

🔧 一、为什么需要自动重启?

在生产环境中,服务可能因内存溢出、资源竞争、外部依赖中断等问题意外崩溃。手动恢复效率低下,而 systemd 的自动重启机制可在秒级内恢复服务,显著提升系统可用性。


⚙️ 二、systemd 自动重启的核心配置

1. 服务文件关键参数

/etc/systemd/system/your-service.service 中定义以下参数:

ini 复制代码
[Service]
Restart=on-failure   # 服务异常退出时重启(推荐)
RestartSec=10s        # 重启前等待时间(避免频繁重启)
StartLimitIntervalSec=300 # 300秒内最多重启次数
StartLimitBurst=5     # 最多尝试5次重启

2. 重启策略详解

策略 适用场景
Restart=on-failure 服务因错误(非零退出码)终止时重启,适合需手动干预的场景(如调试)
Restart=always 无条件重启(包括正常退出),适用于数据库、Web服务器等关键服务

3. 防崩溃保护机制

ini 复制代码
StartLimitIntervalSec=60
StartLimitBurst=3

若服务在 60秒内崩溃超过3次,systemd 将停止重启并标记为失败状态,防止资源耗尽。


🛠️ 三、实战配置示例(以Spring Boot应用为例)

ini 复制代码
[Unit]
Description=Spring Boot Application
After=network.target postgresql.service  # 依赖网络和数据库

[Service]
User=appuser
ExecStart=/usr/bin/java -jar /opt/app.jar
Restart=on-failure
RestartSec=30s
Environment="DB_URL=jdbc:postgresql://localhost/db"
StartLimitIntervalSec=300
StartLimitBurst=5

# 日志重定向(可选)
StandardOutput=file:/var/log/myapp.log
StandardError=file:/var/log/myapp-error.log

[Install]
WantedBy=multi-user.target

操作命令

bash 复制代码
sudo systemctl daemon-reload              # 重载配置
sudo systemctl enable your-service        # 开机自启
sudo systemctl start your-service         # 立即启动

🔍 四、故障排查技巧

  1. 查看实时状态

    bash 复制代码
    systemctl status your-service  # 检查运行状态和最近错误
  2. 追踪日志

    bash 复制代码
    journalctl -u your-service -f  # 实时日志
  3. 测试自动重启

    bash 复制代码
    sudo kill -9 $(pgrep -f "app.jar")  # 模拟崩溃
    systemctl status your-service      # 确认是否在30秒后重启

⚠️ 五、避坑指南

  1. 权限问题:若服务以非 root 用户运行,需确保该用户对文件路径有读写权限。

  2. 环境变量缺失 :通过 Environment 显式声明变量(如 JAVA_HOME)。

  3. 资源泄漏 :频繁重启可能加剧资源消耗,建议结合 cgroups 限制内存/CPU:

    ini 复制代码
    MemoryLimit=1G   # 限制内存为1GB
    CPUQuota=80%     # 限制CPU使用率

💡 六、进阶技巧

  • 多实例服务 :使用模板创建多个实例(如 app@1.serviceapp@2.service)。

  • 安全隔离 :启用沙盒模式增强安全性:

    ini 复制代码
    PrivateTmp=true         # 独立临时目录
    ProtectSystem=strict     # 禁止写入系统文件
  • 看门狗机制 :配合 WatchdogSec=30 实现应用级心跳检测。


💎 总结

> systemd 的自动重启不是简单的"重启开关",而是融合了熔断机制、依赖管理、资源隔离的企业级运维方案。

通过合理配置 Restart 策略与资源限制,可将服务停机时间缩短至秒级,同时避免崩溃循环引发的雪崩效应。其日志集成(journalctl)和状态监控(systemctl status)能力,进一步降低了运维复杂度。

行动建议

下次部署服务时,别再用 nohup!花 5 分钟写一个 systemd 单元文件,让系统自动守护你的进程。