Запретить распространение сигналов на дочерний процесс (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 это то, что мешает распространению сигналов уничтожения, что (удивительно) заключается в том, как дочерние процессы уничтожаются при уничтожении родителя

Другие вопросы по тегам