Дочерний процесс Node.js завершается с SIGTERM

Я создаю дочерний процесс, используя Node 6.9.

const child = require('child_process').execFile('command', args); 
child.stdout.on('data', (data) => {
    console.log('child:', data);
});
child.stderr.on('data', (data) => {
    console.log('child:', data);
});
child.on('close', (code, signal) => {
    console.log(`ERROR: child terminated. Exit code: ${code}, signal: ${signal}`);
});

Мой дочерний процесс работает ~ 1 м 30 с, но затем я получаю этот вывод из моей программы Node.js:

ERROR: child terminated. Exit code: null, signal: SIGTERM

Что завершает мой дочерний процесс и почему?

Редактировать: я добавил killSignal: 'SIGILL' в качестве опции.

var child = require('child_process').execFile('geth', args, { killSignal: 'SIGILL'}); 

Теперь я получаю это:

ERROR: go-ethereum terminated. Exit code: 2, signal: null

person mitchkman    schedule 13.04.2017    source источник
comment
Означает ли «автономный» внутри контейнера, но не созданный узлом, или вне контейнера, но созданный узлом?   -  person Ry-♦    schedule 14.04.2017
comment
Привет, Райан, извини, что я сделал это более ясным. Внутри контейнера, но не порождается узлом   -  person mitchkman    schedule 14.04.2017
comment
Я не думаю, что args имеет свойство timeout? Если вы пройдете Object.assign({}, args, {killSignal: 'SIGILL'}), изменится ли сигнал?   -  person Ry-♦    schedule 14.04.2017
comment
Теперь я получаю ОШИБКУ: go-ethereum прекращен. Код выхода: 2, сигнал: ноль. См. выше.   -  person mitchkman    schedule 14.04.2017


Ответы (1)


Я нашел проблему и решение.

Из https://nodejs.org/dist/latest-v6.x/docs/api/child_process.html#child_process_child_process_execfile_file_args_options_callback

maxBuffer максимальный объем данных (в байтах), разрешенный для stdout или stderr — если превышен дочерний процесс, он будет уничтожен (по умолчанию: 200*1024).

Я могу установить параметр maxBuffer выше.

childProcess.execFile('geth', args, { maxBuffer:  400 * 1024});

Кажется, вы не можете отключить параметр maxBuffer, даже установив для него значение 0. Но, похоже, это сделано специально.

person mitchkman    schedule 17.04.2017
comment
Я думаю, что то же самое произошло со мной, когда я запускал программу с уведомлениями о ходе выполнения в качестве подпроцесса. Поработав некоторое время, Node упал. Кажется сложным оценить, насколько большим должен быть размер буфера. Мне кажется, что хорошим общим решением будет избегать запуска программ, которые регистрируют слишком много информации. - person Jackson; 29.11.2017
comment
Да, это помогает. Но лучше использовать более подходящую функцию — spawn (вместо execFile). См.: medium.com/edge-coders/-e69498fe970a. - person KeyKi; 15.06.2021