2015-06-08 21 views
8

Sto usando child_process.spawn() per avviare uno script dall'applicazione Node.JS in esecuzione su Ubuntu. Per quanto ne so, i processi standard biforcati o generati * nix generalmente non muoiono quando il genitore muore, ma quando generano i processi da Node.JS, sembrano essere uccisi quando la mia applicazione si blocca, o viene interrotta con ctrl-c, ecc.I processi figlio Node.JS vengono uccisi quando il genitore muore

Perché è questo e c'è un modo per aggirare questo? Non riesco a trovare alcuna opzione ovvia nell'API child_process.

La mia applicazione avvia alcune attività a esecuzione prolungata che dovrebbero essere eseguite in background, e se il mio server di nodi si blocca o viene riavviato per qualche altro motivo non voglio interrompere le attività, ma voglio che il server di nodi tornare indietro e riprendere con garbo il monitoraggio dei progressi di quelle attività in esecuzione.

risposta

17

è necessario impostare l'opzione distaccata

Se l'opzione indipendente si trova, il processo figlio sarà effettuata la leader di un nuovo gruppo di processo. Ciò consente al bambino di continuare a essere eseguito dopo la chiusura del genitore.

var child = spawn('prg', [], { 
    detached: true, 
    stdio: [ 'ignore', out, err ] 
}); 
+2

Grazie mille. Non so COME sono riuscito a mancarlo. Per riferimento, se qualcun altro trova utile questa risposta, ecco il manuale: https://nodejs.org/api/child_process.html#child_process_options_detached – JHH

+0

Ho una preoccupazione però. Il manuale e il codice indicano specificamente che stdio deve essere diretto altrove rispetto al processo padre (che è l'impostazione predefinita) affinché il processo continui in background. Tuttavia, ho scoperto che anche se non avessi specificato alcuna opzione di stdio, il processo continuava a funzionare anche dopo aver ucciso il mio server di nodi. Non sono sicuro di cosa stia esattamente succedendo qui, ma forse ['ignorare', 'ignorare', 'ignorare'] è comunque un'opzione saggia. – JHH

+1

non specificando che stdio verrà impostato su stdio: ['pipe', 'pipe', 'pipe'] ... che significa che le pipe sono disponibili tramite ChildProcess.stdin, ChildProcess.stdout e ChildProcess.stderr (in questo caso ** I pensa ** devi leggere da stdout e stderr altrimenti il ​​tuo childprocess potrebbe bloccarsi) ... se non hai bisogno di interagire con lo stdio del processo figlio dal processo genitore, allora puoi semplicemente usare 'ignore' che inoltrerà qualsiasi output dal tuo childprocess to/dev/null – Johny

Problemi correlati