【发布时间】:2019-10-18 10:41:45
【问题描述】:
目标是使用 child_process 从 nodejs 启动 Chrome 或 Chromium,并立即返回,类似于 windows START 命令启动一个完全独立的进程并且调用进程可以立即退出。
child_process.execFile() 的 { shell: true } 选项几乎可以完成这项工作,因为它将节点进程与 Chrome 进程分开;我可以使用 Ctrl+C 退出 nodejs 主进程,并且启动的浏览器保持打开状态。如果没有该选项,他们将保持已婚状态,并且节点中的 ^C 会关闭 Chrome.exe。
然而,我需要的是节点在启动 Chrome 后完全退出。按^C显然没有不利影响。那么如果 ^C 可以退出节点,为什么它不会立即退出呢?我怀疑在chrome进程对象被销毁之前,节点不能良心退出。
有趣的是:如果同一个 Chrome.exe 恰好已经在运行,我正在启动的“新”Chrome 会在该现有 chrome 中启动一个新选项卡或窗口并退出。在这种情况下,nodejs 脚本会立即退出。
const child_process = require('child_process');
let ex = "C:\\PROGRA~2\\Google\\Chrome\\APPLIC~1\\chrome.exe";
let chrome = child_process.execFile(ex, [
// tried various Chromium switches here but nothing helped
], {
shell: true, // this spawns a separate process but node won't exit
} , function(err, data) {
console.log(err)
console.log(data.toString());
});
chrome.stdout.on('data', function (data) {
console.log('stdout: ' + data);
});
chrome.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});
chrome.on('exit', function (code) {
console.log('child process exited with code ' + code);
// chrome.kill();
});
预期:既然 nodejs 可以用 ^C 杀死,为什么它甚至继续运行/阻塞?我希望它在启动 Chrome.exe 后退出。
但是,实际上,nodejs 会一直阻塞,直到我退出 Chrome 或按 ^C。
我也尝试不使用回调函数和 .stdout、.stderr 和 .on 钩子——它们似乎没有帮助或伤害。节点总是阻塞,直到 I ^C 或子进程(尽管是分开的)退出。
【问题讨论】:
-
使用
process.exit(0)以无错误地退出您的脚本。它不会立即退出,因为正在运行EventEmitter(s) -
@r3wt 效果很好,谢谢。我想感觉有点脏;是否没有官方方法可以将子进程与主进程分开(删除
EventEmitters),或者甚至更好的方法来启动child_process以外的进程,这与开始完全分开?我试图在可执行路径前面偷偷输入START命令,因为这是在 Windows 上,但它似乎没有做任何事情。 -
在下面试试我的答案。它非常适合我。
标签: node.js google-chrome chromium