2013-11-25 18 views
34

Utworzony childprocess korzystając shelljsJak zabić dziecko w nodejs?

!/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); 

proces dziecko nadal działa .. po zabić proces nadrzędny

+4

Używasz 'mongod &', który przesyła proces i wysyła go do tła. wysłanie ** SIGINT ** nie zabije rzeczywistego procesu 'mongod'. – fardjad

+0

Jeszcze jedno, zamiast wykonywania 'sudo mongod', wykonaj' mongod' i uruchom skrypt za pomocą 'sudo'. Możesz przywrócić uprawnienia po wykonaniu 'mongod' (z' process.setuid() 'i' process.setgid() ') jeśli chcesz. – fardjad

+0

usunięte "&" i działało .... dzięki http://stackoverflow.com/users/303270/fardjad –

Odpowiedz

52

Jeśli można użyć wbudowanego w węzeł child_process.spawn, jesteś w stanie wysłać sygnał do SIGINT proces potomny:

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

Plusem jest to, że główny proces powinien się zawiesić do czasu zakończenia wszystkich procesów podrzędnych.

+0

nie jest proc.kill() wystarczy? czy potrzebujemy proc.kill ("SIGINT")? –

+0

Nie pamiętam szczegółów 'mongod', ale wysłanie' proc.kill() 'jest (obecnie) równoważne wysyłaniu' proc.kill ('SIGTERM') '(zakładam, że wierzyłem' SIGINT' wyłączyć 'mongod'?). wyobrażam sobie, że wybrałby właściwy sygnał do ich konkretnego zastosowania. –

+6

Jak to odpowiada na pytanie? Ta odpowiedź sugeruje dokładnie to samo, co autor pytania już robi, aby zabić ten proces. Mimo to dostaje się tak dużo przebojów? – fishbone