Дочерний процесс узла не может работать отдельно

Я пытаюсь разветвить дочерний процесс node с помощью

child_process.fork("child.js")

и заставить его сказать живым после выхода родителя. Я пробовал использовать отсоединенный вариант следующим образом:

child_process.fork("child.js", [], {detached:true});

Что работает при использовании spawn, но когда detached является истинным, используя fork, он просто молча терпит неудачу, даже не выполняя child.js.

я тоже пробовал

var p = child_process.fork("child.js")
p.disconnect(); 
p.unref();

Но ребенок все равно умирает, когда умирает родитель. Любая помощь или понимание будет принята с благодарностью.

РЕДАКТИРОВАТЬ:

Версия узла: v5.3.0 Платформа: Windows 8.1 Код:

//Parent
var child_process = require("child_process");

var p;
try{
  console.log(1)
  p = child_process.fork("./child.js")
  console.log(2)
} catch(e){
  console.log(e)
}
p.on('error', console.log.bind(console))

p.disconnect();
p.unref();

//To keep process alive
setTimeout(() => {
  console.log(1);
}, 100000);

--

//Child
var fs = require("fs");

console.log(3);

fs.writeFileSync("test.txt", new Date().toString());

setTimeout(()=>{
  console.log(1);
}, 100000);

person BrightEyed    schedule 08.02.2016    source источник


Ответы (1)


Я предполагаю, что вы выполняете свой родительский файл из командной строки, поэтому, вероятно, «появляется», что разветвленный дочерний файл не выполняется. На самом деле, когда родительский процесс завершается, терминал перестает ждать и, таким образом, печатает новую строку, ожидая вашей следующей команды. Это создает впечатление, что ребенок не выполняет, но поверьте мне, это так. Также нет опции «отдельно» для child_process.fork.

Добавьте несколько операторов console.log() в ваш дочерний процесс, и вы должны увидеть печать ввода в своем терминале даже после выхода родителя. Если вы этого не сделаете, это потому, что ваш ребенок преждевременно выходит из-за ошибки. Запустите дочерний процесс напрямую, чтобы отладить его, прежде чем вызывать его из родителя.

Посмотрите этот быстрый пример:

введите здесь описание изображения

Надеюсь это поможет.

person DogNibbler    schedule 08.02.2016
comment
Спасибо за ответ. Однако я использую монитор процесса и fileWriteSync в дочернем элементе. Это точно не выполняется. Единственная разница между выполнением/не выполнением дочернего процесса — это отсоединенная опция, используемая в fork. - person BrightEyed; 08.02.2016
comment
Чтобы уточнить, он отлично работает, когда не пытается отсоединить разветвленный дочерний процесс. Но при попытке отсоединить это просто не работает. Итак, вы знаете способ создать отсоединенный дочерний процесс с помощью fork без использования detach/detach таким образом, чтобы это работало? - person BrightEyed; 08.02.2016
comment
Я считаю, что child_process.fork по умолчанию отсоединяет дочерний процесс, поэтому на самом деле нет опции отсоединения для fork() - person DogNibbler; 08.02.2016
comment
Кажется, вам нужно предоставить дополнительную информацию, чтобы решить эту проблему. Вы должны отредактировать свой пост, чтобы указать, какую версию узла вы используете, и опубликовать свой код, если он не слишком длинный. Чтобы попытаться устранить эту проблему самостоятельно, начните с простого. Начните с кода, который я предоставил на своем снимке экрана, и постепенно добавляйте части своего кода. Распечатывайте сообщения журнала на каждом шагу, чтобы убедиться, что все работает так, как ожидалось, и чтобы вы могли видеть, где именно что-то идет не так. - person DogNibbler; 08.02.2016
comment
Cпасибо за совет :). Как я уже говорил, дочерний процесс выполняется нормально, если параметр отсоединения не передается в fork, поэтому я думаю, что он просто не предназначен для этого. Проблема в том, что ребенок определенно выходит вместе с родителем, когда я его убиваю (либо в диспетчере задач, либо в консоли), чего не должно быть, если вилка автоматически отсоединяется, верно? - person BrightEyed; 08.02.2016
comment
Вместо того, чтобы убивать через терминал, используйте process.exit() в своем родительском коде. Затем вы должны увидеть ожидаемое поведение. Я не уверен, как работает убийство из консоли или диспетчера задач в Windows, но похоже, что он ищет все процессы Node и убивает их, и в этом случае ребенок тоже будет убит. - person DogNibbler; 08.02.2016
comment
Если вы выбираете отдельные PID и убиваете их, также возможно, что это ошибка/функция того, как Windows управляет разветвленными процессами. Используйте Linux или Mac OS X (Unix), это гораздо более стабильная вычислительная среда. - person DogNibbler; 08.02.2016
comment
Интересно, похоже, что это ошибка узла Windows с разветвленными процессами. Использование process.exit по-прежнему приводит к одинаковому закрытию обоих, но при запуске на машине с Linux дочерний процесс остается, как и должно быть. - person BrightEyed; 09.02.2016
comment
Для вас это Windows;) мораль этой истории в том, что определенно стоит инвестировать в персональный компьютер Mac, особенно если вы разрабатываете программное обеспечение, которое будет работать в облаке (почти всегда Linux), если только вы не вынуждены работать в среде Windows в Работа :( - person DogNibbler; 09.02.2016