2017-01-21 17 views
1

У меня есть NodeJS код вроде следующего:Предотвратить сигналы от распространяющихся детского процесса (NodeJS)

[myFile.js] 

var path = require("path"); 
var cp = require("child_process"); 
var child = cp.spawn("python",["HelloWorld.py"], { stdio:'pipe', }); 

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

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

process.on("SIGINT",()=>{ 
    // close gracefully 
    console.log("Received SIGINT"); 
}) 
child.on('exit',(code)=>{console.log(`child Process exited with code ${code}`)}) 

и питон скрипт, как:

[HelloWorld.py] 

print 'Hi there' 
import time 
time.sleep(5) 

Я хочу управлять выключение грациозно, но когда Я начинаю этот код в командной строке с помощью:

> node myFile.js 

и нажмите Ctrl + C, я получаю это напечатано на консоль:

^CReceived SIGINT 
CHILD stdout: Hi there 

CHILD stderr: Traceback (most recent call last): 
    File "HelloWorld.py", line 3, in <module> 
    time.sleep(5) 
KeyboardInterrupt 

child Process exited with code 1 

, указывающий, что python (работает в дочернем процессе) получил событие клавиатуры «^ C». Тем не менее, я предпочел бы выйти из дочернего процесса немного более изящно, вместо того, чтобы рушиться на клавиатурном прерывании.

Я попробовал различные комбинации для options.stdio, в том числе [undefined,'pipe','pipe'] (который не работал), и ['ignore','pipe','pipe'] (который заставил дочерний процесс к краху), и я попытался worker.stdin.end() (который также вызвал дочерний процесс к сбою) ,

Есть ли способ, чтобы не унаследовал стандарт от родительского процесса NodeJS?

+0

Ты против отлова исключения в вашем питоне скрипте ? Если нет, вы можете обернуть его в оператор 'try'' catch', чтобы отключить эту ошибку. См. Http://stackoverflow.com/questions/7073268/remove-traceback-in-python-on-ctrl-c – Mike

+0

Хорошо, но мой вопрос касается NodeJS, а не Python. Я использую python в приведенном выше примере, потому что (A) он дает понять, что KeyboardInterupt передается дочернему процессу, и (B) код, который я пишу, предназначен для обобщенного бегуна задач, и это невозможно. вставлять try/catch в каждый скрипт и язык, который будет выполняться в дочернем процессе, - лучше, чтобы предотвратить прерывание отправки в дочерний процесс. – Jthorpe

ответ

0

RTFM: установка options.detached к true является то, что предотвращает распространяющиеся уничтожения сигналов, которые (сюрприз) является, как Прилагаются убиты дочерние процессы, когда родитель был убит ...

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

  • Нет связанных вопросов^_^