Почему процесс создания nodejs становится «несуществующим» до тех пор, пока родитель не выйдет

Давайте сначала посмотрим на явление,

Код узла:

const cp = require('child_process');

var ls = cp.spawn('ls', ['/']);

ls.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

ls.stderr.on('data', (data) => {
  console.log(`stderr: ${data}`);
});

ls.on('close', (code) => {
  console.log(`child process closed with code ${code}`);
});

while(true){}

Запустите этот код nodejs, ничего не отображается, похоже, событие не было запущено.

Затем запустите «ps -ef | grep ls | grpe -v grep» в другой оболочке, результат:

liyuanq+ 10995 10990  0 11:06 pts/3    00:00:00 [ls] <defunct>

Если удалить код:

while(true){}

выход процесса узла и инициировал событие on data.

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

Моя среда:

ОС: Debian 8.4 x86_64

Узел: v6.1.0


person Yuanqiu Li    schedule 15.06.2016    source источник


Ответы (1)


Очень интересное наблюдение, спасибо!

Если есть выделенный поток, который выполняет ожидание () для дочернего элемента, этот сценарий не произойдет.

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

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

Если вы замените свой цикл while-true на setTimeout с большой задержкой, поток получит свободный ЦП, дождется дочернего элемента и удалит его из списка задач - я это проверил.

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

person Gireesh Punathil    schedule 15.06.2016
comment
О Господи! Решено! Благодарю вас! - person Yuanqiu Li; 15.06.2016