【发布时间】: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.js 或 d.js)对代码进行调整,我控制两者,但我需要IPC 频道,因此必须通过fork 完成。
【问题讨论】:
-
相关issue.
标签: linux node.js apache daemon child-process