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信号的处理,因此,我必须自己处理它。主要的怪癖是,exit
在q
按键的情况下工作正常,但对于Ctrl-C则不然。
这已经在macOS 13下的Node.js 18上运行。
1条答案
按热度按时间ljsrvy3e1#
按下CTRL+C的那一刻,程序终止,因此不会再读取您的代码。但是,您可以向进程添加事件侦听器,并中断CTRL+C。
添加以下内容以监听CTRL+C