gpt4 book ai didi

linux - 守护进程 'child_process' 是 'fork' ed

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:48:00 25 4
gpt4 key购买 nike

我正在尝试实现类似于 httpd 的行为在开始使用 NodeJS 时有。当我们说:

service httpd start

ps ,我们会看到:

[root@dev ~]# service httpd start
Starting httpd: [ OK ]
[root@dev ~]# ps auxf | grep httpd
root 3395 0.0 0.1 6336 304 pts/0 R+ 12:03 0:00 | \_ grep httpd
root 3391 0.0 1.3 175216 3656 ? Ss 12:02 0:00 /usr/sbin/httpd
apache 3393 0.0 0.9 175216 2432 ? S 12:02 0:00 \_ /usr/sbin/httpd

注意如何 httpd master 和 child 没有终端(对于 ? 显示的是 pts/0 而不是 grep)。

现在...我需要一个 IPC channel ,因此我使用 child_process.fork但无论我做什么,每次我看到一个终端仍然连接到我的守护进程。欢迎您试验以下代码:

c.js - Controller

var cp = require('child_process');

var d = cp.fork('d.js', {});

d.on('message', function() {
d.disconnect();
d.unref();
});

d.js - 守护进程

process.send('ready');

setTimeout(function() {
console.log('test');
}, 10000);

这是我在终端中看到的:

[root@dev ~]# node c.js                 # running the control script
[root@dev ~]# ps auxf | grep node # my terminal is interactive again so I check
root 3472 0.0 0.3 103308 864 pts/0 S+ 12:13 0:00 | \_ grep node
root 3466 1.1 5.6 648548 14904 pts/0 Sl 12:13 0:00 /usr/bin/node d.js
[root@dev ~]# test # appears outta nowhere because d.js still has this stdout

d.js还有我的pts/0并写下 test即使它已经与 bash 交互,也可以访问它对我来说。

我如何解决这个问题并让守护进程删除终端?我不在乎哪一方(c.jsd.js)对代码进行调整,我控制两者,但我需要IPC channel ,因此必须通过 fork 完成.

最佳答案

这可以通过放弃 fork 以支持 spawn 来解决。然后可以将相同的代码重写为:

var cp = require('child_process');
var d = cp.spawn(process.execPath, ['./d.js'], {
detached: true,
stdio: ['ignore', 'ignore', 'ignore', 'ipc']
});

d.unref();
d.disconnect();

stdio 部分是 fork 内部工作的方式。我不知道他们为什么决定不公开整个数组,而是只提供 silent

d.js 将在开始时没有终端(它将是 /dev/null - 与 httpd 相同)。未在 Windows 上测试。

关于linux - 守护进程 'child_process' 是 'fork' ed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34824251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com