本文目录导读:

是的,完全可以,监控指定进程并在其崩溃或异常退出时自动重启,是运维中非常常见的需求,下面我给你提供几个实用脚本,覆盖 Linux 和 Windows 环境,并给出代码示例与使用说明。
Linux 环境(推荐使用 Shell 脚本)
基础版:循环检查 + 重启
#!/bin/bash
# 要监控的进程名(可以是命令名或完整路径的一部分)
PROCESS_NAME="nginx"
# 重启命令(根据实际情况修改)
RESTART_CMD="systemctl restart nginx"
while true; do
# 使用 pgrep 检查进程是否存在(-x 表示精确匹配进程名)
if ! pgrep -x "$PROCESS_NAME" > /dev/null 2>&1; then
echo "[$(date)] 进程 $PROCESS_NAME 未运行,正在执行重启..."
$RESTART_CMD
echo "[$(date)] 重启命令已执行"
else
echo "[$(date)] 进程 $PROCESS_NAME 运行正常"
fi
# 每隔 5 秒检查一次
sleep 5
done
使用方法:
- 将脚本保存为
monitor.sh - 赋予执行权限:
chmod +x monitor.sh - 后台运行:
nohup ./monitor.sh &或使用screen/tmux
进阶版:使用 systemd 自动重启(推荐,无需写脚本)
如果进程是 systemd 管理的服务,可以配置 Restart=always:
[Service] ExecStart=/usr/bin/your_program Restart=always RestartSec=3
systemctl enable your_service 即可,这是最稳妥的方式。
Windows 环境(使用 PowerShell 脚本)
监控并重启指定进程
# 要监控的进程名(不带 .exe 后缀)
$ProcessName = "notepad"
# 进程对应的可执行文件完整路径(用于重启)
$ExePath = "C:\Windows\System32\notepad.exe"
while ($true) {
$processes = Get-Process -Name $ProcessName -ErrorAction SilentlyContinue
if ($processes.Count -eq 0) {
Write-Host "[$(Get-Date)] 进程 $ProcessName 未运行,正在重启..."
Start-Process -FilePath $ExePath
Write-Host "[$(Get-Date)] 重启命令已执行"
} else {
Write-Host "[$(Get-Date)] 进程 $ProcessName 运行正常"
}
Start-Sleep -Seconds 5
}
使用方法:
- 保存为
.ps1文件(monitor.ps1) - 以管理员身份打开 PowerShell
- 执行:
.\monitor.ps1
更健壮的脚本(Linux,支持日志)
#!/bin/bash
PROCESS_NAME="your_app"
RESTART_CMD="/path/to/your_app"
LOG_FILE="/var/log/process_monitor.log"
while true; do
if ! pgrep -x "$PROCESS_NAME" > /dev/null; then
echo "$(date '+%Y-%m-%d %H:%M:%S') 进程 $PROCESS_NAME 崩溃,正在重启..." >> "$LOG_FILE"
# 如果重启失败,可以添加重试逻辑
$RESTART_CMD &
sleep 2
if pgrep -x "$PROCESS_NAME" > /dev/null; then
echo "$(date '+%Y-%m-%d %H:%M:%S') 重启成功" >> "$LOG_FILE"
else
echo "$(date '+%Y-%m-%d %H:%M:%S') 重启失败,可能需要人工干预" >> "$LOG_FILE"
fi
fi
sleep 5
done
使用更专业的工具(无需自己写脚本)
| 工具 | 适用平台 | 特点 |
|---|---|---|
| Supervisor | Linux | 成熟的进程管理工具,支持自动重启、日志、Web管理 |
| PM2 | Node.js 项目 | 自动重启、负载均衡、集群模式 |
| systemd | Linux | 系统自带,最稳定,配置简单 |
| NSSM | Windows | 将普通程序注册为 Windows 服务,自动重启 |
Supervisor 配置示例(Linux)
[program:myapp] command=/path/to/your_app autorestart=true startretries=3 stderr_logfile=/var/log/myapp.err.log stdout_logfile=/var/log/myapp.out.log
supervisorctl start myapp 即可。
NSSM 使用示例(Windows)
nssm install MyService "C:\path\to\your_app.exe" nssm set MyService AppRestartDelay 5000 nssm start MyService
注意事项与优化建议
- 进程名匹配问题:
pgrep -x要求精确匹配,如果进程名有多个实例,可以去掉-x或使用pgrep -f(模糊匹配,按命令行) - 避免重复重启:可以增加重启次数限制,1 分钟内最多重启 3 次,防止进程“刚启动又崩溃”导致无限循环
- 资源占用:检查间隔建议 5~30 秒,太短可能浪费 CPU
- 日志记录:务必记录重启事件,方便排查问题
- 守护进程:如果监控脚本本身挂掉了怎么办?可以用
cron(Linux)或Task Scheduler(Windows)定时检查监控脚本是否存活
如果你愿意告诉我具体是什么进程(Python 脚本、Java 应用、自定义二进制文件),以及你的操作系统版本,我可以帮你进一步定制更精确的脚本。