如何监控某个程序崩溃后自动重启它?

wen 实用脚本 45

本文目录导读:

如何监控某个程序崩溃后自动重启它?

  1. Windows 系统方案
  2. Linux 系统方案
  3. 其他跨平台/高级方案
  4. 注意事项

要监控某个程序崩溃后自动重启,有多种方法可以实现,具体取决于你的操作系统和你对程序的控制需求,以下是针对 Windows 和 Linux 系统的几种常见解决方案:

Windows 系统方案

使用 Windows 服务(推荐用于后台程序)

如果程序可以设计为 Windows 服务(或用工具封装成服务),Windows 服务管理器自带“恢复”功能:

  • 步骤

    1. 打开 services.msc
    2. 找到你的服务,右键 -> 属性 -> “恢复”选项卡。
    3. 设置“第一次失败”、“第二次失败”等为“重新启动服务”。
    4. 可设置“重置失败计数”和“重新启动服务时间”。
  • 优点:原生支持,稳定可靠,无需额外脚本。

  • 缺点:你的程序必须是 Windows 服务。

使用批处理脚本 + 循环检查

写一个简单的 .bat 脚本,不断检查进程是否在运行,如果不在则启动:

@echo off
:start
tasklist /FI "IMAGENAME eq your_program.exe" 2>nul | find /I /N "your_program.exe" >nul
if "%ERRORLEVEL%"=="1" (
    echo Program crashed, restarting...
    start "" "C:\Path\To\your_program.exe"
)
timeout /t 5 /nobreak >nul
goto start
  • 优点:简单,无需额外工具。
  • 缺点:进程会常驻后台,占用一个控制台窗口。

使用第三方工具(如 NSSM - Non-Sucking Service Manager)

可以将任何普通 exe 程序包装成 Windows 服务,并自动配置重启策略:

nssm install MyServiceName "C:\Path\to\your_program.exe"
nssm set MyServiceName AppRestartDelay 5000  # 延迟5秒重启
nssm start MyServiceName
  • 优点:将普通程序变成服务,拥有服务级的自动重启能力。
  • 下载NSSM 官网

使用 PowerShell 脚本(推荐更健壮)

PowerShell 可以监控进程退出并重启,并捕获退出事件:

while ($true) {
    $process = Start-Process -FilePath "C:\Path\To\your_program.exe" -PassThru
    $process.WaitForExit()
    $exitCode = $process.ExitCode
    Write-Host "Process exited with code $exitCode. Restarting..."
    Start-Sleep -Seconds 2
}
  • 优点:可捕获退出码,灵活处理。
  • 缺点:如果程序瞬间崩溃,脚本可能来不及处理。

使用 Windows 任务计划程序

  • 创建一个“任务”,触发器设为“事件”,使用 Windows 日志:
    • 事件来源:Application Error
    • 事件 ID:1000(应用程序错误)
  • 动作为“启动程序”(启动你的程序)。
  • 这种方法需要正确设置触发器,但可以做到崩溃后立即启动。

Linux 系统方案

使用 systemd 服务(推荐)

systemd 是 Linux 上最标准的进程管理工具,自带自动重启功能。

  • 创建服务文件/etc/systemd/system/myapp.service
[Unit]
Description=My Application
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/your_program
Restart=always          # 总是重启
RestartSec=5            # 重启间隔5秒
User=your_user
[Install]
WantedBy=multi-user.target
  • 命令

    sudo systemctl daemon-reload
    sudo systemctl enable myapp.service
    sudo systemctl start myapp.service
  • 优点:最稳定、最推荐,系统级别,日志完善,支持资源限制等。

  • 注意Restart=always 会重启一切退出(包括正常退出),如需仅在崩溃时重启可用 Restart=on-failure

使用 Supervisor

Supervisor 是 Python 写的进程管理工具,适合非 root 用户和复杂场景。

  • 安装apt install supervisorpip install supervisor
  • 配置/etc/supervisor/conf.d/myapp.conf
[program:myapp]
command=/usr/local/bin/your_program
autostart=true
autorestart=true
startretries=3
stderr_logfile=/var/log/myapp.err.log
stdout_logfile=/var/log/myapp.out.log
user=your_user
  • 命令

    sudo supervisorctl reread
    sudo supervisorctl update
    sudo supervisorctl start myapp
  • 优点:轻量、灵活,支持 Web 管理界面,重启逻辑可控。

  • 缺点:需额外安装。

使用 Monit

Monit 是系统监控工具,可以监控进程、文件、网络等,支持自动重启。

  • 安装apt install monit
  • 配置/etc/monit/monitrc/etc/monit/conf.d/myapp.conf
check process myapp with pidfile /var/run/myapp.pid
  start program = "/usr/local/bin/your_program"
  stop program = "/usr/bin/killall your_program"
  if changed pid then restart
  if status != 0 then restart
  • 优点:功能全面,可以监控 CPU、内存等,并自动处理。
  • 缺点:配置稍复杂。

简单的 Shell 脚本(守护进程方式)

适合快速实现,类似 Windows 批处理:

#!/bin/bash
while true; do
    /usr/local/bin/your_program
    echo "Process exited with code $?. Restarting in 2 seconds..."
    sleep 2
done
  • **保存为 monitor.shchmod +x monitor.sh,用 nohup ./monitor.sh & 或 systemd 运行。
  • 优点:超简单。
  • 缺点:如果程序瞬间崩溃导致循环太快,需自己加入延迟。

其他跨平台/高级方案

工具/方案 平台 特点
Docker 容器 (docker restart policy) Linux/Windows 容器崩溃后自动重启,适合微服务
Kubernetes (Deployment的restartPolicy) 集群 自动化大规模管理,生产环境首选
Runit / S6 Linux 轻量级进程监督工具,适合嵌入式或简单环境
Process Governor (Windows) Windows 开源工具,专门用于崩溃后重启

  • 生产环境(Linux 服务器)systemd 是最标准、最稳定的方案。
  • 简单桌面程序(Windows)批处理脚本PowerShell 快速实现。
  • 需要日志和复杂重启策略Supervisor(Linux)或 NSSM(Windows)。
  • 容器化Docker + restart=always

注意事项

  1. 避免无限重启:程序如果因配置错误或依赖缺失而瞬间崩溃,自动重启可能会导致CPU高占用或日志暴涨,建议在重启策略中加入延迟(如 5 秒)和次数限制。
  2. 检查退出码:有些程序正常退出也会返回 0,最好根据退出码判断是“应该被重启”还是“主动退出”。
  3. 日志和告警:好的监控不仅要自动重启,还要记录崩溃日志,最好能发送通知(如邮件、钉钉、Slack)。
  4. 资源清理:重启前确保旧进程的资源(端口、文件锁)已被释放,否则新实例可能启动失败。

如果你能提供具体的操作系统和程序类型(桌面应用、后台服务、脚本等),我可以给出更针对性的配置示例。

抱歉,评论功能暂时关闭!