Node уничтожает порожденные дочерние процессы автоматически? - PullRequest
1 голос
/ 18 января 2020

В документации по дочерним процессам узла это предложение содержится в разделе child_process.spawn():

Вкл. Windows, установка options.detached в * 1008. * позволяет дочернему процессу продолжать работу после выхода из родительского процесса.

Это звучит как (по крайней мере, Windows), когда вы оставляете options.detached значение по умолчанию false, spawn() 'процессы будут автоматически убиты. Это именно то поведение, которое мне нужно в моем приложении, и на самом деле я вызывал myChildProcess.kill( "SIGINT" ) в своем коде, но закомментировал его, и дочерние процессы все равно ушли, когда мое приложение закрылось. Так что это замечательно, но:

(1) Насколько я понимаю, необходимо сделать некоторые хитрые вещи с «объектами задания», как обсуждено здесь , чтобы сделать эту работу на Windows , Знаете ли вы, если Node делает что-то хитрое, чтобы убрать дочерние процессы go? Или, может быть, это проще, и Node просто хранит список идентификаторов порожденных процессов и убивает любые из них, которые все еще присутствуют при завершении работы? Что приводит к тесно связанному вопросу ...

(2) Если Node действительно делает что-то особенное для уничтожения дочерних процессов, знаете ли вы, есть ли такие случаи (например, какое-то приложение для cra sh) что побудило бы его выполнить и оставило бы дочерние процессы запущенными?

UPDATE : Чтобы уточнить, дочерние процессы, которые я запускаю в моем случае, являются Python процессами веб-сервера, а не другими Узел процессов. Я не знаю, есть ли разница в поведении между дочерним процессом Node и каким-либо другим дочерним процессом для целей этого вопроса.

Ответы [ 2 ]

0 голосов
/ 18 января 2020

Если вы хотите, чтобы дочерний процесс был долгосрочным и выдерживал завершение самого процесса узла, как вы знаете, вы установили options.detached = true.

Эта операция остановки дочернего процесса, когда родительский процесс остановка процесса - это поведение операционной системы. Родительский процесс (работающий с любой системой языка программирования, а не только с узлом) владеет неотделенным дочерним процессом. ОС очищает дочерние процессы после завершения их родителя.

Отключение процесса говорит ОС, что он больше не является дочерним процессом, поэтому ОС не будет очищать его автоматически.

Хорошая практика для дочерних процессов узла: когда бы ни было возможно, имейте они выполняют назначенную им задачу и затем выходят. Другими словами, в большинстве случаев вам не нужно полагаться на это детское / отстраненное поведение.

0 голосов
/ 18 января 2020

Экземпляр Node будет завершен, если в очереди событий ничего не останется (и нет асинхронного c ожидающего кода), поэтому, если вы ничего не оставите открытым, то, естественно, процесс Node завершится, когда done.

С точки зрения процесса, висящего на cra sh, если вы явно не обрабатываете необработанные исключения, процесс завершится немедленно.

...