如何从node.js单独启动Chrome并立即返回?

如何从node.js单独启动Chrome并立即返回?,node.js,google-chrome,chromium,Node.js,Google Chrome,Chromium,目标是使用child_进程从nodejs启动Chrome或Chrome,并立即返回,类似于windows START命令启动完全独立的进程,调用进程可以立即退出 const child_process = require('child_process'); let ex = "C:\\PROGRA~2\\Google\\Chrome\\APPLIC~1\\chrome.exe"; let chrome = child_process.execFile(ex, [ // tried variou

目标是使用child_进程从nodejs启动Chrome或Chrome,并立即返回,类似于windows START命令启动完全独立的进程,调用进程可以立即退出

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();
});
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

要实现这两个目标:立即退出并保持子流程运行的可能性,请按照以下说明操作

  • 使用
    subProcess.unref()
    它防止父进程等待给定的子进程退出

  • 还有一个是
    分离
    选项和
    stdio:'ignored'
    选项,它允许您在停止nodejs进程后仍保持子进程的活动状态


使用
process.exit(0)
以无错误的方式退出脚本。它不会立即退出,因为有正在运行的
EventEmitter
(s)@r3wt工作得很好,谢谢。我想感觉有点脏;是否没有正式的方法将子进程从主进程中分离出来(删除
EventEmitter
s),或者更好的方法是,除了
child\u进程
,启动一个与开始完全分离的进程?我尝试在可执行路径前面插入
START
命令,因为这是在Windows上,但它似乎没有任何作用。请尝试下面的答案。它非常适合我。