2016-01-16 3 views
1

Я пытаюсь добиться такого же поведения, как 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.

+0

Релевантно [выпуск] (https://github.com/odin-public/aps-node-runtime/issues/7). – Gear54rus

ответ

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.

Смежные вопросы