PM2 守护进程监控与重启脚本

这是一个用于 Windows 环境下,定时检查 PM2 进程状态并在必要时执行重启的 PowerShell 脚本,以及配套的 Task Scheduler XML 配置。通过阅读,你将了解脚本的核心逻辑、日志记录方式,以及计划任务的触发条件和运行环境设置。该配置已在生产环境验证成功。

如果你还不知道什么是PM2?PM2 是一个专为Node.js 应用设计的进程管理工具,可以让你的服务在后台稳定运行。它支持自动重启、负载均衡、日志记录,并能在应用崩溃时快速恢复。简单来说,PM2 就像是Node.js 项目的“管家”,确保你的服务始终在线、性能稳定

powered by Moshow郑锴-https://zhengkai.blog.csdn.net/

一、PM2 Daemon - PowerShell 脚本详解

# This script checks if pm2 is running and restarts it if necessary - by Moshow
# https://zhengkai.blog.csdn.net/

$count = pm2 ls --no-color | Select-String "online" | Measure-Object | Select-Object -ExpandProperty Count
$time = Get-Date -Format "yyyy-MM-dd HH:mm:ss"

if ($count -gt 0) {
    Write-Output "pm2 is running at $time"
} else {
    Write-Output "pm2 is restarting at $time"
    pm2 resurrect
    pm2 start all
    "PM2 restarted at $time" >> "D:\DataShare\LOGS\pm2_daemon.log"
}

1. 环境检测与状态统计

  • pm2 ls --no-color:列出所有 PM2 管理的进程,不带颜色信息,方便后续文本处理。

  • Select-String "online":在输出中筛选包含 “online” 的行,即正在正常运行的进程行。

  • Measure-Object | Select-Object -ExpandProperty Count:统计筛选结果的行数,赋值给 $count

2. 时间戳获取

powershell

$time = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
  • 以“年-月-日 时:分:秒”格式获取当前系统时间,便于日志统一。

3. 判断与输出

powershell

if ($count -gt 0) {
    Write-Output "pm2 is running at $time"
} else {
    Write-Output "pm2 is restarting at $time"
    ...
}
  • $count 大于 0,表示至少有一个进程在线,输出运行状态。

  • 否则,进入重启流程。

4. 重启流程与日志

  • pm2 resurrect:恢复上一次保存的所有进程配置。

  • pm2 start all:启动所有在 PM2 配置中记录的应用。

  • ">>":追加写入重启时间到指定日志文件 D:\DataShare\LOGS\pm2_daemon.log

二、Windows Task Scheduler XML 配置详解

xml

<?xml version="1.0" encoding="UTF-16"?>
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
    <RegistrationInfo>
        <Date>2025-07-11T00:00:00.916606</Date>
        <Author>****</Author>
        <Description>PM2 Daemon Scheduler by Moshow https://zhengkai.blog.csdn.net/, find the restart log on D:\DataShare\LOGS\pm2_daemon.log</Description>
    </RegistrationInfo>
    <Triggers>
        <CalendarTrigger>
            <Repetition>
                <Interval>PT15M</Interval>
                <Duration>P1D</Duration>
                <StopAtDurationEnd>false</StopAtDurationEnd>
            </Repetition>
            <StartBoundary>2025-07-11T00:00:00.916606</StartBoundary>
            <Enabled>true</Enabled>
            <ScheduleByDay>
                <DaysInterval>1</DaysInterval>
            </ScheduleByDay>
        </CalendarTrigger>
    </Triggers>
    <Principals>
        <Principal id="Author">
            <UserId>****</UserId>
            <LogonType>Password</LogonType>
            <RunLevel>LeastPrivilege</RunLevel>
        </Principal>
    </Principals>
    <Settings>
        <MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
        <DisallowStartIfOnBatteries>true</DisallowStartIfOnBatteries>
        <StopIfGoingOnBatteries>true</StopIfGoingOnBatteries>
        <AllowHardTerminate>true</AllowHardTerminate>
        <StartWhenAvailable>false</StartWhenAvailable>
        <RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
        <IdleSettings>
            <StopOnIdleEnd>true</StopOnIdleEnd>
            <RestartOnIdle>false</RestartOnIdle>
        </IdleSettings>
        <AllowStartOnDemand>true</AllowStartOnDemand>
        <Enabled>true</Enabled>
        <Hidden>false</Hidden>
        <RunOnlyIfIdle>false</RunOnlyIfIdle>
        <WakeToRun>false</WakeToRun>
        <ExecutionTimeLimit>P3D</ExecutionTimeLimit>
        <Priority>7</Priority>
    </Settings>
    <Actions Context="Author">
        <Exec>
            <Command>C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe</Command>
            <Arguments>D:\Qlik\CsvImportService\pm2_daemon.ps1</Arguments>
            <WorkingDirectory>D:\Qlik\CsvImportService</WorkingDirectory>
        </Exec>
    </Actions>
</Task>

1. 注册信息 (RegistrationInfo)

  • Date:首次注册或最后更新的时间戳。

  • Author:任务创建者标识。

  • Description:简要说明任务用途及日志位置。

2. 触发器 (Triggers)

  • CalendarTrigger:基于日历的触发方式。

  • Repetition

    1. Interval PT15M:每 15 分钟重复执行一次。

    2. Duration P1D:此重复周期在 24 小时内有效。

  • StartBoundary:任务从指定时间点开始调度。

  • ScheduleByDay

    • DaysInterval 1:每天都触发重复。

3. 运行主体 (Principals)

  • UserId:执行任务所用的 Windows 用户。

  • LogonType Password:使用密码登录执行。

  • RunLevel LeastPrivilege:以最小权限运行,增强安全性。

4. 设置 (Settings)

  • MultipleInstancesPolicy IgnoreNew:若上次任务未结束,则忽略新任务。

  • 电源策略:

    • DisallowStartIfOnBatteriesStopIfGoingOnBatteries:仅在接通电源时运行并保持。

  • ExecutionTimeLimit P3D:最多允许 3 天的执行时间。

  • Priority 7:中等偏低优先级,避免占用过多系统资源。

5. 执行动作 (Actions)

  • 调用 PowerShell 可执行文件:

    • Command:指定完整路径到 powershell.exe

    • Arguments:要运行的脚本路径 D:\Qlik\CsvImportService\pm2_daemon.ps1

    • WorkingDirectory:脚本运行的当前目录。

三、最佳实践与扩展

  • 确保日志目录有写入权限,并定期清理或归档历史日志,避免磁盘占满。

  • 若脚本报错,可将输出重定向到额外的错误日志,以便排查。

  • 可根据业务需求,将触发间隔调整为 5 分钟或更长,以平衡监控实时性与系统负载。

  • 如果系统重启后需要自动恢复,勾选计划任务的“运行时无论用户是否登录”并配置“使用最高权限运行”。

  • 在生产环境中,搭配邮件或消息通知,一旦 PM2 重启,可立即获知并排查根因。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值