如何从node.js启动Chrome作为一个单独的过程并立即返回?

时间:2019-06-02 18:29:07

标签: node.js google-chrome chromium

目标是使用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或子进程(尽管是单独的)退出为止。

2 个答案:

答案 0 :(得分:0)

在此处以r3wt的注释作为答案:使用process.exit(0)可以正确退出脚本。它不会立即退出,因为正在运行EventEmitter

答案 1 :(得分:0)

const path = require('path');
const spawn = require('child_process').spawn;

chrome = spawn(
    path.join(__dirname, '/path_to_chrome'), 
    [ ... your chrome switches here], 
    {
        shell: true,         // use to run in a shell if you need
        detached: true,      // important
        stdio: 'ignore'      // important
    }
);
chrome.unref(); // this one is important too

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

  • 使用explained heresubProcess.unref() 这样可以防止父级等待给定的子进程退出。

  • 还有一个thing选项和detachedstdio:'ignored'选项,即使您停止nodejs进程后,该选项也可以使子进程保持活动状态。