[英]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.