У меня есть 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?
Ты против отлова исключения в вашем питоне скрипте ? Если нет, вы можете обернуть его в оператор 'try'' catch', чтобы отключить эту ошибку. См. Http://stackoverflow.com/questions/7073268/remove-traceback-in-python-on-ctrl-c – Mike
Хорошо, но мой вопрос касается NodeJS, а не Python. Я использую python в приведенном выше примере, потому что (A) он дает понять, что KeyboardInterupt передается дочернему процессу, и (B) код, который я пишу, предназначен для обобщенного бегуна задач, и это невозможно. вставлять try/catch в каждый скрипт и язык, который будет выполняться в дочернем процессе, - лучше, чтобы предотвратить прерывание отправки в дочерний процесс. – Jthorpe