在Node.js中监听用户输入,但也处理子进程的Ctrl-C

yjghlzjz  于 2023-06-29  发布在  Node.js
关注(0)|答案(1)|浏览(141)

bounty还有4天到期。回答此问题可获得+100声望奖励。slhck希望引起更多关注这个问题。

我有一个Node.js应用程序,可以通过ChromeDriver启动Chrome。当用户按下Q键时,我想干净地退出应用程序,关闭ChromeDriver,并退出主进程。这同样适用于Ctrl-C,只是在这种情况下我可能不会运行一些特殊的清理例程。
下面是一个最小的可重复的示例(假设你安装了Chrome和ChromeDriver,你只需要运行npm i selenium-webdriver就可以运行它):

#!/usr/bin/env node

const webdriver = require("selenium-webdriver");
const chrome = require("selenium-webdriver/chrome");

console.log("Start");

const options = new chrome.Options();
options.addArguments("--disable-extensions");
options.addArguments("--disable-gpu");
options.addArguments("--no-sandbox");
options.addArguments("--disable-dev-shm-usage");

const driver = new webdriver.Builder()
  .forBrowser("chrome")
  .setChromeOptions(options)
  .build();

driver.get("https://www.google.com");

const exit = (signal) => {
  console.log("Exit via " + signal);
  if (signal == "quit") {
    console.log("Doing some cleanup before quitting");
  } else {
    console.log("Exiting immediately");
  }
  driver && driver.quit();
  process.exit(0);
};

const { stdin } = process;
stdin.setRawMode(true);
stdin.resume();
stdin.setEncoding("utf8");

stdin.on("data", async (key) => {
  if (key.toString().trim() === "q") {
    exit("quit");
  } else if (key.toString().trim() === "\u0003") {
    exit("CTRL-C");
  }
});

console.log(
  "Waiting for input. Press Q to quit normally or Ctrl-C to exit immediately."
);

当我按下Q时,它退出运行清理例程,然后退出驱动程序,然后退出。
然而,当我按Ctrl-C时,它退出主进程,但**不退出驱动程序。**它保持打开状态,我必须手动关闭它。
为什么按Ctrl-C时driver.quit()方法不起作用?我怎么才能让它工作?在监听任意用户输入时,是否有其他方法可以复制Ctrl-C的默认行为?
注意:我知道为输入设置原始模式会禁用SIGINT kill信号的处理,因此,我必须自己处理它。主要的怪癖是,exitq按键的情况下工作正常,但对于Ctrl-C则不然。
这已经在macOS 13下的Node.js 18上运行。

ljsrvy3e

ljsrvy3e1#

按下CTRL+C的那一刻,程序终止,因此不会再读取您的代码。但是,您可以向进程添加事件侦听器,并中断CTRL+C。

添加以下内容以监听CTRL+C

process.on('SIGINT', function() {
    //perform your cleanup work

    //then when your ready, you can perform the exit.
    process.exit();
});

相关问题