如何在按下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脚本实现信号监听:
- 在项目根目录新建
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); });
- 修改package.json的dev脚本为:
"dev": "node dev.js"
优化提示
- 你可以把
pm2:del脚本调整为pm2 delete dev || exit 0,只清理当前项目的dev实例,避免误删其他运行中的PM2进程。
内容的提问来源于stack exchange,提问作者ZiiMakc
相关产品推荐
相关产品推荐

