本文目录导读:

要监控某个程序崩溃后自动重启,有多种方法可以实现,具体取决于你的操作系统和你对程序的控制需求,以下是针对 Windows 和 Linux 系统的几种常见解决方案:
Windows 系统方案
使用 Windows 服务(推荐用于后台程序)
如果程序可以设计为 Windows 服务(或用工具封装成服务),Windows 服务管理器自带“恢复”功能:
-
步骤:
- 打开
services.msc。 - 找到你的服务,右键 -> 属性 -> “恢复”选项卡。
- 设置“第一次失败”、“第二次失败”等为“重新启动服务”。
- 可设置“重置失败计数”和“重新启动服务时间”。
- 打开
-
优点:原生支持,稳定可靠,无需额外脚本。
-
缺点:你的程序必须是 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 supervisor或pip 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.sh,chmod +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。
注意事项
- 避免无限重启:程序如果因配置错误或依赖缺失而瞬间崩溃,自动重启可能会导致CPU高占用或日志暴涨,建议在重启策略中加入延迟(如 5 秒)和次数限制。
- 检查退出码:有些程序正常退出也会返回 0,最好根据退出码判断是“应该被重启”还是“主动退出”。
- 日志和告警:好的监控不仅要自动重启,还要记录崩溃日志,最好能发送通知(如邮件、钉钉、Slack)。
- 资源清理:重启前确保旧进程的资源(端口、文件锁)已被释放,否则新实例可能启动失败。
如果你能提供具体的操作系统和程序类型(桌面应用、后台服务、脚本等),我可以给出更针对性的配置示例。