You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Cron仅在PM2进程未运行时重启Node.js应用?

嘿,这个场景太常见了——服务器重启后PM2没自动拉起应用,或者应用意外停掉,我们只想在它真的没运行的时候才重启,而不是不管三七二十一就执行pm2 restart。我之前折腾过这个,写个Bash脚本就能完美解决,给你详细说下:

解决方案:通过Bash脚本判断PM2应用状态再执行重启

核心思路就是先获取目标应用的运行状态,只有当它处于stopped状态或者压根没被PM2管理时,才执行重启操作。

1. 编写状态检查脚本

创建一个名为pm2_check_and_restart.sh的脚本,把下面的内容复制进去:

#!/bin/bash

# 替换成你的应用名称/ID,比如pm2 list里显示的app.js或者自定义的应用名
TARGET_APP="app.js"

# 获取应用的当前状态:用pm2 describe拿到详细信息,过滤出status行并提取状态值
APP_STATUS=$(pm2 describe "$TARGET_APP" | grep -i "status" | awk '{print $4}')

# 判断逻辑:如果状态为空(应用未被PM2管理)或者状态是stopped,就执行重启
if [ -z "$APP_STATUS" ] || [ "$APP_STATUS" = "stopped" ]; then
    echo "$(date): 应用[$TARGET_APP]未运行或处于stopped状态,执行重启..."
    pm2 restart "$TARGET_APP"
else
    echo "$(date): 应用[$TARGET_APP]当前状态为$APP_STATUS,无需重启"
fi

2. 给脚本添加执行权限

在终端里执行这条命令,让脚本可以被运行:

chmod +x pm2_check_and_restart.sh

3. 配置Crontab定时执行

打开Crontab的编辑界面:

crontab -e

添加一行定时任务,比如每分钟检查一次(你可以根据需求调整频率,比如每5分钟就写*/5 * * * *):

*/1 * * * * /绝对路径/pm2_check_and_restart.sh >> /var/log/pm2_restart_check.log 2>&1

注意把/绝对路径/替换成脚本实际所在的路径,后面的日志文件是用来记录脚本执行情况的,方便后续排查问题。

额外优化:覆盖PM2本身未启动的场景

如果服务器重启后PM2进程都没起来,上面的脚本会失效。可以在脚本开头加一段检查PM2是否运行的逻辑:

# 先检查PM2主进程是否存在
if ! pgrep -x "pm2" > /dev/null; then
    echo "$(date): PM2主进程未运行,先启动PM2并恢复应用..."
    pm2 resurrect  # 如果你之前用pm2 save保存过进程列表,用这个命令恢复
    # 如果没保存过,就直接用pm2 start app.js
    # pm2 start app.js
fi

内容的提问来源于stack exchange,提问作者Aerodynamika

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:08:25