Windows CMD中按Ctrl+C终止进程时如何自动执行指定命令
npm start执行时按Ctrl+C退出自动清屏的实现方法
Ctrl+C触发时系统会向当前前台进程发送SIGINT信号,只要捕获这个信号、在进程退出前执行清屏命令即可,根据项目场景选对应方案:
方案1:Node项目直接加信号监听(无额外依赖,跨平台)
如果你的npm start是直接运行NodeJS编写的服务/脚本,直接在入口文件最顶部加入以下代码即可:
const { execSync } = require('child_process') // 适配不同系统的清屏命令 const clear = process.platform === 'win32' ? 'cls' : 'clear' process.on('SIGINT', () => { // 执行清屏,stdio设为inherit保证清屏命令输出直接作用到当前终端 execSync(clear, { stdio: 'inherit' }) // 正常退出,避免进程残留 process.exit(0) })
如果遇到部分特殊终端clear/cls不生效,可以把清屏命令换成ANSI原生清屏转义序列,全终端兼容:
process.stdout.write('\x1Bc')
方案2:包装非Node类启动命令(适配Vite/Webpack/前端脚手架等)
如果你的npm start是跑前端脚手架、第三方服务这类没有自定义Node入口的场景,可以写一层极小的启动包装层,不用改第三方代码:
- 项目根目录新建
start-wrap.js:
const { spawn } = require('child_process') const isWin = process.platform === 'win32' const clearCmd = isWin ? 'cls' : 'clear' // 替换成你原来package.json里start的命令,比如原来是"vite",就写spawn('npx', ['vite'], ...) // 如果是多命令组合比如"tsc && vite",直接写spawn('npm run dev', { shell: true, ...}) 也行 const service = spawn('你原来的start执行命令', ['对应参数'], { stdio: 'inherit', shell: true }) const exitHandler = () => { service.kill('SIGINT') spawn(clearCmd, { stdio: 'inherit', shell: true }) process.exit(0) } process.on('SIGINT', exitHandler)
- 修改
package.json里的start脚本:
{ "scripts": { "start": "node start-wrap.js" } }
方案3:纯Shell写法(仅单系统使用时最简便)
如果你确定团队只用Mac/Linux,可以直接在npm脚本里用shell的trap捕获退出事件,不用写JS代码:
{ "scripts": { "start": "trap 'clear' EXIT; 替换成你原来的start命令" } }
Windows PowerShell环境对应写法:
{ "scripts": { "start": "trap {cls} EXIT; 替换成你原来的start命令" } }
注意:纯Shell写法跨平台兼容性差,多系统协作的项目不推荐使用。
注意事项
- 监听SIGINT的回调里一定要手动调用
process.exit(0),否则会出现进程挂住、终端无法输入的问题 - 如果用了nodemon、ts-node-dev这类热重载工具,信号监听代码要放在业务入口最顶部,避免被工具的信号拦截逻辑覆盖
- 远程SSH、嵌入式终端等精简环境下,优先用
\x1BcANSI转义码清屏,比系统自带的clear/cls兼容性更好
内容的提问来源于stack exchange,提问作者Zexeret
相关产品推荐
相关产品推荐

