Es ist jetzt viel einfacher (6 Jahre später)!
Spawn gibt ein childObject zurück , mit dem Sie dann auf Ereignisse warten können . Die Ereignisse sind:
- Klasse: ChildProcess
- Ereignis: 'Fehler'
- Ereignis: 'Beenden'
- Ereignis: 'schließen'
- Ereignis: 'Verbindung trennen'
- Ereignis: 'Nachricht'
Es gibt auch eine Reihe von Objekten aus childObject :
- Klasse: ChildProcess
- child.stdin
- child.stdout
- child.stderr
- child.stdio
- child.pid
- child.connected
- child.kill ([Signal])
- child.send (message [, sendHandle] [, callback])
- child.disconnect ()
Weitere Informationen zu childObject finden Sie hier: https://nodejs.org/api/child_process.html
Asynchron
Wenn Sie Ihren Prozess im Hintergrund ausführen möchten, während der Knoten weiterhin ausgeführt werden kann, verwenden Sie die asynchrone Methode. Sie können weiterhin Aktionen ausführen, nachdem Ihr Prozess abgeschlossen wurde und wenn der Prozess eine Ausgabe hat (z. B. wenn Sie die Ausgabe eines Skripts an den Client senden möchten).
child_process.spawn (...); (Knoten v0.1.90)
var spawn = require('child_process').spawn;
var child = spawn('node ./commands/server.js');
// You can also use a variable to save the output
// for when the script closes later
var scriptOutput = "";
child.stdout.setEncoding('utf8');
child.stdout.on('data', function(data) {
//Here is where the output goes
console.log('stdout: ' + data);
data=data.toString();
scriptOutput+=data;
});
child.stderr.setEncoding('utf8');
child.stderr.on('data', function(data) {
//Here is where the error output goes
console.log('stderr: ' + data);
data=data.toString();
scriptOutput+=data;
});
child.on('close', function(code) {
//Here you can get the exit code of the script
console.log('closing code: ' + code);
console.log('Full output of script: ',scriptOutput);
});
So würden Sie eine Callback + asynchrone Methode verwenden :
var child_process = require('child_process');
console.log("Node Version: ", process.version);
run_script("ls", ["-l", "/home"], function(output, exit_code) {
console.log("Process Finished.");
console.log('closing code: ' + exit_code);
console.log('Full output of script: ',output);
});
console.log ("Continuing to do node things while the process runs at the same time...");
// This function will output the lines from the script
// AS is runs, AND will return the full combined output
// as well as exit code when it's done (using the callback).
function run_script(command, args, callback) {
console.log("Starting Process.");
var child = child_process.spawn(command, args);
var scriptOutput = "";
child.stdout.setEncoding('utf8');
child.stdout.on('data', function(data) {
console.log('stdout: ' + data);
data=data.toString();
scriptOutput+=data;
});
child.stderr.setEncoding('utf8');
child.stderr.on('data', function(data) {
console.log('stderr: ' + data);
data=data.toString();
scriptOutput+=data;
});
child.on('close', function(code) {
callback(scriptOutput,code);
});
}
Mit der obigen Methode können Sie jede Ausgabezeile des Skripts an den Client senden (z. B. mit Socket.io, um jede Zeile zu senden, wenn Sie Ereignisse auf stdout
oder empfangen stderr
).
Synchron
Wenn Sie möchten, dass der Knoten seine Arbeit beendet und wartet, bis das Skript abgeschlossen ist , können Sie die synchrone Version verwenden:
child_process.spawnSync (...); (Knoten v0.11.12 +)
Probleme mit dieser Methode:
- Wenn das Skript eine Weile dauert, bleibt Ihr Server für diese Zeit hängen!
- Das stdout wird erst zurückgegeben, wenn das Skript ausgeführt wurde . Da es synchron ist, kann es nicht fortgesetzt werden, bis die aktuelle Zeile beendet ist. Daher ist es nicht möglich, das 'stdout'-Ereignis zu erfassen, bis die Spawn-Linie beendet ist.
Wie man es benutzt:
var child_process = require('child_process');
var child = child_process.spawnSync("ls", ["-l", "/home"], { encoding : 'utf8' });
console.log("Process finished.");
if(child.error) {
console.log("ERROR: ",child.error);
}
console.log("stdout: ",child.stdout);
console.log("stderr: ",child.stderr);
console.log("exist code: ",child.status);
python
wird, vergessen Sie nicht, das-u
Flag zu übergeben, damit die Konsolenausgabe nicht gepuffert