2013-02-21 17 views
7

Il seguente codice:Come pulire i processi figli su child_process.spawn() in node.js

#!/usr/bin/env node 
"use strict"; 

var child_process = require('child_process'); 

var x = child_process.spawn('sleep', [100],); 

throw new Error("failure"); 

genera un processo figlio e le uscite senza attendere il processo figlio in uscita.

Come posso attendere? Mi piacerebbe chiamare waitpid (2) ma child_process sembra non avere waitpid (2).

aggiunto:

Siamo spiacenti, quello che voglio è quello di uccidere il processo figlio quando esiste il genitore, invece di aspettare.

+0

se si lancia un err oppure l'applicazione si chiude se non viene rilevato l'errore. Vuoi aspettare il processo figlio e poi uscire dall'applicazione? – pfried

+1

Infatti, mi piacerebbe terminare il processo figlio al termine del processo genitore. –

risposta

13
#!/usr/bin/env node 
"use strict"; 

var child_process = require('child_process'); 

var x = child_process.spawn('sleep', [10]); 

x.on('exit', function() { 
    throw (new Error("failure")); 
}); 

EDIT:

È possibile ascoltare per il processo principale con l'aggiunta di un listener al principale process come process.on('exit', function() { x.kill() })

Ma gettando un errore come questo è un problema, è meglio chiudere il processo process.exit()

#!/usr/bin/env node 
"use strict"; 

var child_process = require('child_process'); 

var x = child_process.spawn('sleep', [100]); 

process.on('exit', function() { 
    x.kill(); 
}); 

process.exit(1); 
+0

process.on ('exit') e process.on ('uncaughtException') possono fare ciò che voglio. Grazie! –

+3

si prega di contrassegnare la risposta come accettata se risolve il problema – pfried

+0

è effettivamente necessario attendere il processo figlio dopo averlo ucciso, altrimenti il ​​processo figlio si trasformerà in un processo di zombie. Quando termina il processo genitore, pid 1 (init) avrà il compito di ripulirlo. Funziona, ma tecnicamente, è meglio se il genitore pulisce il suo casino prima di uscire. –

3
#!/usr/bin/env node 
"use strict"; 

var child_process = require('child_process'); 

var x = child_process.spawn('sleep', [10]); 

process.on('exit', function() { 
    if (x) { 
    x.kill(); 
    } 
}); 
+1

'E '' if (x) 'un buon controllo se il processo figlio termina prima che venga chiamato' x.kill() 'e impedisca di uccidere accidentalmente un processo che ha ottenuto un PID reasigned? – Sukima

Problemi correlati