实用脚本能监控指定进程并重启吗?

wen 实用脚本 3

本文目录导读:

实用脚本能监控指定进程并重启吗?

  1. Linux 环境(推荐使用 Shell 脚本)
  2. Windows 环境(使用 PowerShell 脚本)
  3. 更健壮的脚本(Linux,支持日志)
  4. 使用更专业的工具(无需自己写脚本)
  5. 注意事项与优化建议

是的,完全可以,监控指定进程并在其崩溃或异常退出时自动重启,是运维中非常常见的需求,下面我给你提供几个实用脚本,覆盖 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

使用方法:

  1. 将脚本保存为 monitor.sh
  2. 赋予执行权限:chmod +x monitor.sh
  3. 后台运行: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
}

使用方法:

  1. 保存为 .ps1 文件(monitor.ps1
  2. 以管理员身份打开 PowerShell
  3. 执行:.\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

注意事项与优化建议

  1. 进程名匹配问题pgrep -x 要求精确匹配,如果进程名有多个实例,可以去掉 -x 或使用 pgrep -f(模糊匹配,按命令行)
  2. 避免重复重启:可以增加重启次数限制,1 分钟内最多重启 3 次,防止进程“刚启动又崩溃”导致无限循环
  3. 资源占用:检查间隔建议 5~30 秒,太短可能浪费 CPU
  4. 日志记录:务必记录重启事件,方便排查问题
  5. 守护进程:如果监控脚本本身挂掉了怎么办?可以用 cron(Linux)或 Task Scheduler(Windows)定时检查监控脚本是否存活

如果你愿意告诉我具体是什么进程(Python 脚本、Java 应用、自定义二进制文件),以及你的操作系统版本,我可以帮你进一步定制更精确的脚本。

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