Как убить дочерний процесс в nodejs?

Создал дочерний процесс с помощью shelljs

!/usr/bin/env node

require('/usr/local/lib/node_modules/shelljs/global');
   fs = require("fs");  
   var child=exec("sudo mongod &",{async:true,silent:true});

   function on_exit(){
        console.log('Process Exit');
        child.kill("SIGINT");
        process.exit(0)
    }

    process.on('SIGINT',on_exit);
    process.on('exit',on_exit);

Дочерний процесс все еще работает.. после уничтожения родительского процесса


person Deepak Patil    schedule 25.11.2013    source источник
comment
Вы запускаете mongod &, который разветвляет процесс и отправляет его в фоновый режим. отправка SIGINT не остановит фактический процесс mongod.   -  person fardjad    schedule 25.11.2013
comment
Еще одна вещь, вместо выполнения sudo mongod, выполните mongod и запустите свой скрипт с помощью sudo. Вы можете отказаться от привилегий после выполнения mongodprocess.setuid() и process.setgid()), если хотите.   -  person fardjad    schedule 25.11.2013
comment
удалил '&', и это сработало.... спасибо stackoverflow.com/users/303270/fardjad   -  person Deepak Patil    schedule 25.11.2013
comment
@fardjad, так как с этим бороться? Мы все знаем, что ты сказал. Это написано здесь, никакого секрета nodejs.org/api/. Но справиться с этим? Ты знаешь?   -  person Green    schedule 11.01.2018
comment
@Green Может быть, это поможет: npmjs.com/package/ps-tree   -  person fardjad    schedule 12.01.2018


Ответы (1)


Если вы можете использовать встроенный в узел child_process.spawn, вы можете отправить сигнал SIGINT на дочерний процесс:

var proc = require('child_process').spawn('mongod');
proc.kill('SIGINT');

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

person Michael Tang    schedule 25.11.2013
comment
proc.kill() недостаточно? или нам нужен proc.kill('SIGINT')? - person Alexander Mills; 11.10.2016
comment
я не помню особенностей mongod, но отправка proc.kill() (в настоящее время) эквивалентна отправке proc.kill('SIGTERM') (я предполагаю, что я полагал, что SIGINT закроет mongod?). Я предполагаю, что можно было бы выбрать правильный сигнал для своего конкретного приложения. - person Michael Tang; 14.10.2016
comment
Как это отвечает на вопрос? Этот ответ предполагает то же самое, что автор вопроса уже делает, чтобы убить процесс. Тем не менее, он получает так много голосов? - person fishbone; 18.05.2017
comment
НЕПРАВИЛЬНЫЙ! Вы не можете завершить службу, запущенную в дочернем процессе. Вы можете убить дочерний процесс, но не можете остановить службу. Вот в чем проблема: ` сигнал, доставленный дочернему процессу, может фактически не завершать процесс.` /апи/ - person Green; 11.01.2018
comment
Спасибо, это сэкономило мое время! Кроме того, у меня была проблема, что мой разветвленный процесс породил другие процессы (с кластером), и .kill('SIGINT') сделал свое дело и правильно закрыл все дочерние и дочерние процессы для меня в моем приложении electronic-nodejs - person Kirill Husiatyn; 26.02.2018
comment
Это не убивает фактический процесс в некоторых случаях, если опция shell равна true - person AliFurkan; 30.10.2020
comment
@fishbone, нет, это не то же самое. Прочтите еще раз. В ответе предлагается использовать spawn вместо exec. - person Christian Fritz; 21.05.2021