繁体   English   中英

父进程杀死子进程,即使detached设置为true

[英]parent process kills child process, even though detached is set to true

我对此感到非常困惑,并且几个月来一直在努力寻找解决方案。 我在OSX上。

我听说使用child_process.spawn并将detached选项设置为true时,它将作为新进程组的领导者启动子进程,如果父进程退出,则子进程可能会继续运行。 但是,我从未见过任何证据。

https://nodejs.org/api/child_process.html

例如:

const n = cp.spawn('node', ['watch-transpile.js'], {
    detached: true,
    stdio: ['ignore']
});

以上是由父级执行的,如果我们运行$ ps aux | grep node $ ps aux | grep node

我们得到:

Olegzandr        2546   0.0  0.2  3048544  19564   ??  Ss   11:29PM   0:00.09 node lib/transpile/watch-transpile.js

Olegzandr        2541   0.0  0.7  3115684  60216 s000  S+   11:29PM   0:01.47 node index -t -a -w

但是当我用control-c杀死父进程时,子进程和父进程一样死亡。

如何真正创建一个独立于带有节点的父进程的后台进程? 这真杀了我!

尝试包括child.unref()方法。

默认情况下,父级将等待分离的子级退出。 为了防止父母等待给定的孩子,请使用child.unref()方法。 这样做将导致父级的事件循环不将子级包括在其引用计数中,从而允许父级独立于子级退出,除非在子级与父级之间建立了IPC通道。

使用分离选项启动长时间运行的进程时,除非父进程没有提供未连接到父进程的stdio配置,否则该进程将在父进程退出后不会在后台继续运行。 如果父代的stdio被继承,则子代将保持与控制终端的连接。

一个长时间运行的过程的示例,通过分离并忽略其父stdio文件描述符,以忽略父级的终止:

例:

const n = cp.spawn('node', ['watch-transpile.js'], {
    detached: true,
    stdio: ['ignore']
}).unref();

示例来自文档 ):

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

const child = spawn(process.argv[0], ['child_program.js'], {
  detached: true,
  stdio: ['ignore']
});

child.unref();

或者,可以将子进程的输出重定向到文件中:

const fs = require('fs');
const spawn = require('child_process').spawn;
const out = fs.openSync('./out.log', 'a');
const err = fs.openSync('./out.log', 'a');

const child = spawn('prg', [], {
 detached: true,
 stdio: [ 'ignore', out, err ]
});

child.unref();

啊哈! 当然。 那些愚蠢的Node文档!

这可行。

        const n = cp.spawn('node', ['lib/transpile/watch-transpile.js'], {
            detached: true,
            stdio: ['ignore', 'ignore', 'ignore']
        });

您可以显式忽略每个stdio流,而不仅仅是使用“ ignore”一次。 文档没有直接提及这一点,但是考虑到stdio属性是一个数组,这是有道理的。

在Github上看到此问题: https : //github.com/nodejs/node/issues/7269#issuecomment-225698625

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM