Запретить распространение сигналов на дочерний процесс (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}`)})
и сценарий Python, как:
[HelloWorld.py]
print 'Hi there'
import time
time.sleep(5)
Я хочу изящно управлять выключением, но когда я запускаю этот код из командной строки через:
> node myFile.js
и нажмите control-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?
1 ответ
RTFM: настройка параметров. true
это то, что мешает распространению сигналов уничтожения, что (удивительно) заключается в том, как дочерние процессы уничтожаются при уничтожении родителя