2012-10-13 16 views
16

Intenzione: chiamare un'applicazione esterna con argomenti specificati e uscire dallo script.Come staccare un processo figlio generato in uno script Node.js?

Il seguente script non funziona come dovrebbe:

#!/usr/bin/node 
var cp = require('child_process'); 
var MANFILE='ALengthyNodeManual.pdf'; 
cp.spawn('gnome-open', ['\''+MANFILE+'\''], {detached: true}); 

Cose provato: exec - non staccare. Molte grazie in anticipo

risposta

25

dalla documentazione node.js:

Per impostazione predefinita, il genitore si aspetta per il bambino distaccato per uscire. Per impedire al genitore di attendere un determinato bambino, utilizzare il metodo child.unref() e il ciclo di eventi del genitore non includerà il figlio nel suo conteggio di riferimento.

Quando si utilizza l'opzione distaccata per avviare un processo di lunga durata, il processo non verrà eseguito in background a meno che non sia fornito con una configurazione di stdio non connessa al genitore. Se lo stdio del genitore è ereditato, il bambino rimarrà collegato al terminale di controllo.

è necessario modificare il codice simile a questo:

#!/usr/bin/node 
var fs = require('fs'); 
var out = fs.openSync('./out.log', 'a'); 
var err = fs.openSync('./out.log', 'a'); 

var cp = require('child_process'); 
var MANFILE='ALengthyNodeManual.pdf'; 
var child = cp.spawn('gnome-open', [MANFILE], { detached: true, stdio: [ 'ignore', out, err ] }); 
child.unref(); 
+1

Grazie un mazzo! Funziona. –

+2

È possibile impostare "ignore" per stdin, stdout, stderr: 'stdio: ['ignore'/* stdin * /, 'ignore'/* stdout * /, 'ignore'/* stderr * /]' –

3

la mia soluzione a questo problema:

app.js

require('./spawn.js')('node worker.js'); 

spawn.js

module.exports = function(command) { 
    require('child_process').fork('./spawner.js', [command]); 
}; 

spawner.js

require('child_process').exec(
    'start cmd.exe @cmd /k "' + process.argv[2] + '"', 
    function(){} 
); 
process.abort(0); 
+0

I Sto aggiungendo questo qui anche se hai selezionato una risposta, perché le mie ricerche su google non mi hanno lasciato soluzioni alternative evidenti. – CarbonDonuts

+0

Questo è, come puoi vedere, specifico del sistema operativo. Non molto utile per quelli su OS X e Unix/Linux. La risposta accettata utilizza le librerie standard node.js proprie. –

+2

L'intento era: _creare un terminale di comando separato e passare un comando_ ovvero avviare un processo. "child_process" è purtroppo leggermente inferiore alla necessità di generare processi indipendenti dal master in questo senso. Basta sostituire con il tuo gusto Linux: xterm, xdg-open. A meno che tu non possa mostrarmi il modo di farlo con il tuo codice ... allora funziona su Windows e Linux. ; P Come ho detto sto cercando di risolvere un problema che è vicino ma non del tutto vicino a dove vuoi essere. Google mi ha buttato qui, come la mia ultima speranza prima che mi arrendessi e ho capito qualcosa per me stesso. Scusa per il disturbo. – CarbonDonuts

Problemi correlati