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

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入口的场景,可以写一层极小的启动包装层,不用改第三方代码:

  1. 项目根目录新建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)
  1. 修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 21:45:43