【问题标题】:Daemonize 'child_process' that was 'fork'ed守护被“分叉”的“child_process”
【发布时间】:2016-04-21 19:48:08
【问题描述】:

我正在尝试实现类似于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 主子和子进程没有终端(? 显示为 pts/0,而不是 grep)。

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

c.js - 控制器

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 频道,因此必须通过fork 完成。

【问题讨论】:

标签: linux node.js apache daemon child-process


【解决方案1】:

这可以通过放弃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 上测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多