PM2事件响应咨询:如何在事件触发时执行自定义脚本?
PM2事件触发时执行脚本的解决方案
嘿,这个需求其实PM2完全能实现,可能你看文档的时候没留意到事件钩子和事件总线这两块——我之前也遇到过类似需求,下面给你两种实用的解决方案:
方案1:通过Ecosystem配置文件绑定事件钩子
PM2允许你在生态系统配置文件里直接绑定特定事件的处理脚本,比如进程重启后触发通知。这种方式简单直接,适合轻量需求。
首先创建或修改你的ecosystem.config.js:
module.exports = { apps: [{ name: '你的应用名称', script: './app.js', // 定义事件钩子,支持多个事件类型 hooks: { // 进程重启完成后执行的脚本 postRestart: './send-restart-notification.js', // 可选:进程退出时执行的脚本 postExit: './handle-process-exit.js' } }] };
然后编写send-restart-notification.js来实现通知逻辑(比如发邮件、Slack消息):
// send-restart-notification.js const sendAlert = async () => { console.log('检测到进程重启,正在发送通知...'); // 这里替换成你的通知逻辑,比如调用第三方API // 示例:发送HTTP请求到你的通知服务 // const fetch = require('node-fetch'); // await fetch('https://your-alert-service.com/notify', { // method: 'POST', // headers: { 'Content-Type': 'application/json' }, // body: JSON.stringify({ // message: `应用 ${process.env.PM2_APP_NAME} 已重启,进程ID: ${process.env.PM2_APP_PM_ID}` // }) // }); }; sendAlert().catch(err => console.error('通知发送失败:', err));
最后用PM2启动应用:pm2 start ecosystem.config.js,以后每次进程重启,PM2都会自动执行这个通知脚本。
方案2:用PM2 Event Bus实现实时事件监听
如果需要更灵活的控制(比如同时监听多个事件、做复杂的条件判断),可以用PM2的内部事件总线来订阅所有进程的状态变化。
编写一个独立的监控脚本pm2-event-monitor.js:
// pm2-event-monitor.js const pm2 = require('pm2'); // 连接到PM2 pm2.connect(err => { if (err) { console.error('连接PM2失败:', err); process.exit(1); } console.log('已连接到PM2事件总线,开始监听进程事件...'); // 启动事件总线监听 pm2.launchBus((err, bus) => { // 监听进程重启事件 bus.on('process:restart', data => { console.log(`进程 ${data.process.name} (ID: ${data.process.pm_id}) 触发了重启事件`); // 调用通知逻辑 require('./send-restart-notification.js'); }); // 可选:监听其他事件 // bus.on('process:exit', data => { // console.log(`进程 ${data.process.name} 已退出`); // }); // bus.on('process:error', data => { // console.log(`进程 ${data.process.name} 发生错误:`, data.error); // }); }); });
启动这个监控脚本:pm2 start pm2-event-monitor.js --name pm2-monitor,它会一直后台运行,实时捕获PM2管理的所有进程事件。
小提示
- 确保通知脚本的依赖包已经安装(比如
node-fetch),可以用npm install node-fetch --save安装。 - 钩子脚本是同步执行的,避免在里面写太耗时的逻辑,防止阻塞PM2的进程管理。
- 可以通过
pm2 logs pm2-monitor查看监控脚本的运行日志,方便排查问题。
内容的提问来源于stack exchange,提问作者Sergei Basharov
相关产品推荐
相关产品推荐

