Узел подпроцесс не регистрирует SIGINT на subprocess.kill ('SIGINT') - PullRequest
0 голосов
/ 08 сентября 2018

Я хочу закончить мой дочерний процесс обработкой сигнала SIGINT. У меня есть основной процесс, который запускает дочерний процесс:

const childProcess = require('child_process');

console.log('started main');

const subprocess = childProcess.exec('node childProcess.js', (error, stdout) => {
    console.log('error:', error);
    console.log('log from child process: .............');
    console.log(stdout);
    console.log('log from child process - end: .............');
});

console.log('last line main');

subprocess.kill('SIGINT');

setTimeout(() => {
    console.log('ended main');
}, 3000);

Дочерний процесс выглядит так:

const fs = require('fs');
console.log('child started');

process.on('SIGINT', () => {
    console.log('child ending');
    fs.writeFileSync('test1.txt', 'abc');
    process.exit();
});

fs.writeFileSync('test0.txt', 'abc');

setTimeout(() => {
    console.log('timeout ended');
}, 2000);

Когда я запускаю основной процесс с node index.js с терминала, я получаю следующий вывод:

started main
last line main
error: { Error: Command failed: node childProcess.js

    at ChildProcess.exithandler (child_process.js:272:12)
    at ChildProcess.emit (events.js:127:13)
    at maybeClose (internal/child_process.js:933:16)
    at Process.ChildProcess._handle.onexit (internal/child_process.js:220:5)
  killed: true,
  code: null,
  signal: 'SIGINT',
  cmd: 'node childProcess.js' }
log from child process: .............
child started
timeout ended

log from child process - end: .............
ended main

Это означает, что обработчик SIGINT в дочернем процессе не запускается. Также text0.txt создается как побочный эффект, а text1.txt - нет. Я также пытался без setTimeout в дочернем процессе, но SIGINT не срабатывает. Почему SIGINT не срабатывает?

окружающая среда:

  • Ubuntu 16.04

  • узел v9.6.1

Мне удалось запустить SIGTERM в дочернем процессе, закончив его в списке процессов «системный монитор».

...