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

如何在按下CTRL+C终止npm脚本时自动执行yarn pm2:del清理pm2实例

实现CTRL+C终止yarn dev时自动清理PM2实例的方案

你当前的dev脚本属于串行执行命令,webpack --watch 是阻塞的前台进程,按下CTRL+C只会终止webpack进程,已经启动的PM2后台进程不会被自动清理,我们可以通过捕获终止信号触发清理逻辑来实现需求,以下是两种可选方案:

方案一:直接修改package.json scripts(类Unix环境通用)

适合Mac/Linux用户,以及Windows下使用WSL、Git Bash的场景,无需新增额外文件,直接修改dev脚本即可:

"scripts": {
  "dev": "yarn pm2:del && yarn pm2:dev && trap 'yarn pm2:del' EXIT SIGINT && yarn wp:dev",
  "pm2:dev": "pm2 start ecosystem.config.js --only dev",
  "pm2:del": "pm2 delete all || exit 0",
  "wp:dev": "webpack --mode=development --watch"
}

说明:这里通过shell的trap命令捕获EXIT、SIGINT两种信号,无论进程是被CTRL+C手动终止还是异常退出,都会自动执行yarn pm2:del清理PM2实例。

方案二:全平台兼容的Node启动脚本

如果需要兼容Windows原生CMD/PowerShell,shell的trap命令无法生效,可以通过Node.js脚本实现信号监听:

  1. 在项目根目录新建dev.js文件,内容如下:
const { execSync, spawn } = require('child_process');

// 先清理历史PM2实例
execSync('yarn pm2:del', { stdio: 'inherit' });
// 启动项目PM2实例
execSync('yarn pm2:dev', { stdio: 'inherit' });

// 启动webpack监听模式
const wpProcess = spawn('yarn', ['wp:dev'], { stdio: 'inherit', shell: true });

// 监听CTRL+C触发的SIGINT终止信号
process.on('SIGINT', () => {
  console.log('正在清理PM2实例...');
  execSync('yarn pm2:del', { stdio: 'inherit' });
  process.exit(0);
});
  1. 修改package.json的dev脚本为:
"dev": "node dev.js"

优化提示

  • 你可以把pm2:del脚本调整为pm2 delete dev || exit 0,只清理当前项目的dev实例,避免误删其他运行中的PM2进程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:24:03