завершите дочерний элемент изящно при нажатии Ctrl- C в NodeJS - PullRequest
0 голосов
/ 27 мая 2020

У меня есть архитектура с одним родителем, которая порождает дочерний элемент, как показано ниже:

this.process = child.spawn(this.cmd, this.args);

this.process.on('exit', (code: number, signal: string) => {
    this.exitCode = code;
    console.log(`exit code: ${code}`);
});

нет конкретного варианта, потому что я хочу сохранить связь с дочерним элементом. Итак, когда я нажимаю Ctr- C, чтобы убить родителя, он ловит SIGINT, чтобы (1) завершить дочерний элемент, (2) завершить работу правильно. Но SIGINT также передается потомку, поэтому родитель не может закончить его изящно. Итак, есть ли способ сделать это? может быть, предотвратив передачу SIGINT ребенку? или сказать ребенку, чтобы он игнорировал сигнал?

Я знаю, что что-то возможно, добавив опции detached: true и stdio: 'ignore' при порождении, но я не хочу этого делать, потому что, если родитель умирает, я закончить с процессом зомби. В то время как сохранение ссылок гарантирует, что ребенок будет убит, если родитель неожиданно умрет. Наконец, я хочу избежать попадания SIGINT в дочерний элемент, поскольку я хочу, чтобы он оставался немым.

EDIT: у родителя уже есть process.on('SIGINT', () => { ... }, а у ребенка python.

1 Ответ

1 голос
/ 27 мая 2020

Вы можете перехватывать коды выхода следующим образом:

process.on('SIGINT', () => {
  // handle it yourself
})

Вы можете распространять его на детей следующим образом:

process.on('SIGINT', () => {
  this.child.kill('SIGINT')
})

Потомок, конечно, также может выбрать обработку сигнала, разумно не предполагать, что дочерний процесс завершится просто потому, что вы отправили единственный сигнал. Возможно, вам потребуется установить тайм-аут и отправить повторные или другие сигналы, чтобы полностью убить процесс. Вы также захотите прослушать сообщение 'exit' дочернего процесса, чтобы узнать, когда он фактически завершился, прежде чем продолжить.

Документация

...