【问题标题】:How to launch Chrome from node.js as a separate process and return immediately?如何从 node.js 作为一个单独的进程启动 Chrome 并立即返回?
【发布时间】: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


【解决方案1】:

在此处发布r3wt 的评论作为答案:使用process.exit(0) 以无错误地退出您的脚本。它不会立即退出,因为正在运行 EventEmitter(s)

【讨论】:

    【解决方案2】:
    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
    

    要同时实现:立即退出并保持子进程运行的可能性,- 请按照以下说明进行操作。

    • 使用subProcess.unref(),即explained here 它可以防止父进程等待给定的子进程退出。

    • 另外一个thingdetached 选项以及stdio:'ignored',即使您停止nodejs 进程,您也可以让子进程保持活动状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      • 2018-05-12
      • 2015-01-03
      • 2015-02-21
      • 2012-07-20
      • 1970-01-01
      • 2014-07-15
      相关资源
      最近更新 更多