2015-09-12 2 views
1

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

// parent.js 
var spawn = require('child_process').spawn; 
var child = spawn('node', ['child.js']); 

child.stdout.on('data', function(data) { 
    console.log('data from child: ' + data); 
}); 

child.kill('SIGINT'); 


// child.js 
console.log('child calling'); 
process.on('SIGINT', function() { 
    console.log('Received SIGINT signal'); 
}); 

Когда я печатаю

узел parent.js

Почему нет выхода? даже вывод «child call» в child.js?

Надеюсь, что кто-нибудь мне поможет? Благодарю.

Кроме того, я не понимаю, когда выполняется child.js, во время выполнения инструкции? Надеюсь, кто-нибудь может дать подробное объяснение? Благодарю.

var child = spawn('node', ['child.js']); 

ответ

2

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

setTimeout(function() { 
    child.kill('SIGINT'); 
}, 100); 

Теперь вы увидите

data from child: child calling 

, а затем он выйдет. Но вы ожидаете сообщение SIGINT. На этот раз проблема заключается в том, что дочерний процесс регистрируется, регистрируется для сигнала, а затем выполняется. node.js закончится, если он закончит и ничего не ждет. Вещи, которые он будет ждать, включают открытые сокеты, setTimeout и т. Д. Тем не менее вам нужно что-то делать. В качестве простого теста, вы можете просто добавить к child.js:

setInterval(function() { 
    console.log('hey!'); 
}, 1000); 

Или что-то подобное. Затем вы увидите результат, который ожидаете.

+0

Спасибо @Aaron Dufour. Я попробовал ваше предложение. Оно работает. Хотя я до сих пор не совсем понимаю ваши слова: «Вещи, которые он будет ждать, включают открытые сокеты, setTimeouts и т. Д.» Вы имеете в виду, что setTimeouts в parent.js откроет дочерние сокеты? Не могли бы вы дать более подробное объяснение? Я также пробовал себя, я пытаюсь добавить «process.stdin.resume()» во главе child.js и добавить «process.stdin.end()» в обработчик «SIGINT», он также работает. Как насчет вашего мнения об этой резолюции? Спасибо. –

+0

На самом деле я не совсем понимаю, что означает «открытые сокеты»? Неявно операции типа "process.stdin.resume()" ?? –

+0

Открытые сокеты будут такими, как открытие TCP-соединения или запуск сервера (у ребенка). Что вы на самом деле пытаетесь сделать? То, что вы сейчас делаете, похоже на тест, но если вы сделаете что-то реальное, это скорее всего приведет к тому, что node.js будет продолжать работать. –

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