Форкинг в NodeJS - PullRequest
       36

Форкинг в NodeJS

9 голосов
/ 27 октября 2011

Я немного запутался в том, как создавать демоны в NodeJS

Я создал демонов в C до этого вызова fork(), которые продолжают выполнение с того места, где был сделан вызов в дочернем процессе, позволяя родительскому завершиться. Я не могу легко добиться того же эффекта, используя process.fork() и process.kill().

Следующий код не делает то, что я ожидал, и ломается:

var current_pid, cp = require('child_process');
current_pid = process.pid;
cp.fork('');
process.kill(current_pid);

Выдается следующая ошибка, и я не могу понять, почему или что происходит:

node.js:202
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
Error: read EBADF
    at errnoException (net.js:589:11)
    at Pipe.onread (net.js:335:20)

Проблема вызова выглядит как process.kill(). После этого оба процесса продолжают успешно выполняться.

Мне известно о daemon.node , но он был создан в то время, когда child_process.fork() не существовало (v0.1.33 была версией, доступной на момент написания daemon.node). Теперь есть нативный способ форка, поэтому в этом больше нет необходимости. (К тому же, похоже, он тоже заброшен.)

Ответы [ 2 ]

9 голосов
/ 27 октября 2011

child_process.fork() имеет полностью вводящее в заблуждение имя и не совпадает с fork().

В соответствии с документами , он выполняет узел.JS-скрипт как дочерний процесс и устанавливает канал связи между вызывающим процессом и дочерним процессом.Вот и все.

Фактическое порождение дочернего процесса выполняется внутри libuv , «уровня платформы Node» в C, а сам fork() не доступен для скриптов Node.

Простой, значительно улучшаемый способ демонизации с использованием только того, что встроено в Node.js, может выглядеть следующим образом:

if (process.argv[2] !== 'child') {
    require('child_process').execFile(process.argv[0], [__filename, 'child']);
    process.exit();
}

setTimeout(function(){
    console.log('foo');
}, 5000);

Очевидно, это довольно сильно отличается от fork().Если у вас работает daemon.node, продолжайте его использовать.

1 голос
/ 31 марта 2012

daemon.node продолжает развиваться на https://github.com/indexzero/daemon.node.

...