这是一个用于 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
:-
Interval
PT15M:每 15 分钟重复执行一次。 -
Duration
P1D:此重复周期在 24 小时内有效。
-
-
StartBoundary
:任务从指定时间点开始调度。 -
ScheduleByDay
:-
DaysInterval
1:每天都触发重复。
-
3. 运行主体 (Principals
)
-
UserId
:执行任务所用的 Windows 用户。 -
LogonType
Password:使用密码登录执行。 -
RunLevel
LeastPrivilege:以最小权限运行,增强安全性。
4. 设置 (Settings
)
-
MultipleInstancesPolicy
IgnoreNew:若上次任务未结束,则忽略新任务。 -
电源策略:
-
DisallowStartIfOnBatteries
与StopIfGoingOnBatteries
:仅在接通电源时运行并保持。
-
-
ExecutionTimeLimit
P3D:最多允许 3 天的执行时间。 -
Priority
7:中等偏低优先级,避免占用过多系统资源。
5. 执行动作 (Actions
)
-
调用 PowerShell 可执行文件:
-
Command
:指定完整路径到powershell.exe
。 -
Arguments
:要运行的脚本路径D:\Qlik\CsvImportService\pm2_daemon.ps1
。 -
WorkingDirectory
:脚本运行的当前目录。
-
三、最佳实践与扩展
-
确保日志目录有写入权限,并定期清理或归档历史日志,避免磁盘占满。
-
若脚本报错,可将输出重定向到额外的错误日志,以便排查。
-
可根据业务需求,将触发间隔调整为 5 分钟或更长,以平衡监控实时性与系统负载。
-
如果系统重启后需要自动恢复,勾选计划任务的“运行时无论用户是否登录”并配置“使用最高权限运行”。
-
在生产环境中,搭配邮件或消息通知,一旦 PM2 重启,可立即获知并排查根因。