Я пытаюсь добиться такого же поведения, как httpd
, начиная с NodeJS. Когда мы говорим:Daemonize 'child_process', который был 'fork'ed
service httpd start
В ps
, мы увидим:
[[email protected] ~]# service httpd start
Starting httpd: [ OK ]
[[email protected] ~]# 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);
И это то, что я вижу в терминале:
[[email protected] ~]# node c.js # running the control script
[[email protected] ~]# 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
[[email protected] ~]# test # appears outta nowhere because d.js still has this stdout
d.js
все еще имеет мой pts/0
и пишет test
, даже если он уже взаимодействует с bash
для меня.
Как исправить это и заставить демона покинуть терминал? Меня не волнует, какая сторона (c.js
или d.js
) получает корректировки кода, я управляю обоими, но мне нужно, чтобы IPC-канал, и поэтому это должно быть сделано через fork
.
Релевантно [выпуск] (https://github.com/odin-public/aps-node-runtime/issues/7). – Gear54rus