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

PM2能否在停止进程前执行Shell脚本?求完整示例

PM2停止/终止进程前执行Shell脚本的实现方法

问题描述

我想了解PM2是否可以在停止/终止进程前执行Shell(bash)脚本?我知道PM2可以启动运行Shell脚本的进程,希望在停止/终止进程前处理一些事务。

我是PM2新手,尝试实现该功能但未成功,恳请提供完整示例。

我执行了以下命令:

pm2 start sleep sleep.sh
pm2 list

pm2 trigger sleep pre-stop "./test.sh"
Not any process has received a command (offline or unexistent)

其中sleep.sh仅执行1000秒休眠,test.sh仅输出Hello。但pm2 trigger命令报错,非常希望得到示例指导。

解决方案

PM2确实支持在进程停止/终止前执行自定义脚本,你之前用pm2 trigger的方式不对,正确做法是通过PM2配置文件定义生命周期钩子,而非临时触发命令。

完整示例步骤

  1. 准备脚本文件并添加执行权限

    • 业务脚本sleep.sh:
      #!/bin/bash
      echo "业务进程启动,开始休眠1000秒"
      sleep 1000
      
    • 停止前预处理脚本pre-stop.sh:
      #!/bin/bash
      echo "=== 正在执行停止前的预处理操作 ==="
      echo "Hello from pre-stop script"
      # 此处可添加自定义事务逻辑,如清理临时文件、发送通知等
      

    给两个脚本添加执行权限:

    chmod +x sleep.sh pre-stop.sh
    
  2. 创建PM2配置文件(ecosystem.config.js)
    在配置文件中定义进程信息与生命周期钩子:

    module.exports = {
      apps: [
        {
          name: "sleep-demo", // 唯一进程名称,避免与系统命令重名
          script: "./sleep.sh", // 业务脚本路径
          pre_stop: "./pre-stop.sh" // 指定停止前执行的脚本路径
        }
      ]
    };
    
  3. 通过配置文件启动进程

    pm2 start ecosystem.config.js
    
  4. 测试停止逻辑
    执行停止命令:

    pm2 stop sleep-demo
    

    随后通过pm2 logs sleep-demo查看日志,即可看到pre-stop.sh的输出内容。

错误原因说明

pm2 trigger是用于给在线PM2进程发送自定义信号的工具,并非绑定生命周期钩子的方式;另外你用sleep作为进程名,可能与系统内置命令重名导致PM2无法识别,通过配置文件指定唯一进程名更可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 12:17:09