2015-05-13 3 views
0

Я использую spawn для создания дочерних процессов. Я хочу создать дочерний процесс и после он запущен Я хочу выйти из текущего процесса.Обработка дочернего процесса начиная с

var Spawn = require("child_process").spawn; 

var sp = Spawn("sleep", ["10000"]);   
sp.unref();         

process.exit();        

Код выше работает отлично: он создает дочерний процесс (sleep), который будет жить 10 секунд и текущий процесс завершается.

Могу ли я быть уверенным, что когда я делаю process.exit(), процесс активен или заканчивается родительский процесс, также будет убит и дочерний процесс?

В этом простом примере process.exit() бесполезен, так как процесс все равно закончится, потому что я звоню unref. Однако это всего лишь пример.

Итак, есть ли какие-либо события для прослушивания от sp (детский процесс), который говорит мне, что эй я активен?

В некоторых случаях (например, var sp = Spawn("node", ["foo", "--bar"]);) Я вижу [nodejs] <defunct> на выходе ps aux | grep node, сразу после вызова икры. Это происходит в режиме отладки, где я могу управлять запуском приложения. Это значит, что процесс еще не активирован, я думаю.

+0

сигналы друг. –

ответ

2

Глядя на источник io.js, child_process.spawn() вызывает ChildProcess.spawn(), который устанавливает свойство .pid только после того, как все проверки ошибок произошли. Итак, вы можете сделать это, чтобы проверить, установлено ли свойство pid на объекте, возвращаемом spawn(), и если да, то вы можете быть уверены, что ваш дочерний процесс успешно запущен.

(Это могло бы быть лучше внимательно посмотреть, как все ошибки распространяется обратно и обрабатывать их вместо того, чтобы полагаться на pid. Или, может быть, pid абсолютно надежны, потому что вы не можете иметь pid без процесса? Кто-то, кто знает больше хочет взвесить комментарий или отредактировать этот ответ, чтобы улучшить его?)

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

defunct объясняется в ps man page:

Процессы, отмеченные мертвые процессы (так называемые «зомби») , которые остаются, потому что их родители не разрушила их должным образом. Эти процессы будут уничтожены инициализации (8), если родительский процесс завершается.»

+0

Если я могу проверить PID дочернего процесса сразу после запуска' child_process.spawn() ', то означает ли это, что запуск процесса является синхронным и блокирующим? Если pid установлен на объект, возвращаемый 'spawn', и он не установлен, например, если команда не найдена, то spawn должен блокироваться при поиске PATH, файловой системе доступен и т. д. Правильно ли это? – rsp

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