Für eine noch neuere Version von Node.js (v8.1.4) sind die Ereignisse und Aufrufe ähnlich oder identisch mit älteren Versionen, es wird jedoch empfohlen, die neueren Standard-Sprachfunktionen zu verwenden. Beispiele:
Verwenden Sie für gepufferte, nicht Stream-formatierte Ausgaben (Sie erhalten alles auf einmal) child_process.exec
:
const { exec } = require('child_process');
exec('cat *.js bad_file | wc -l', (err, stdout, stderr) => {
if (err) {
// node couldn't execute the command
return;
}
// the *entire* stdout and stderr (buffered)
console.log(`stdout: ${stdout}`);
console.log(`stderr: ${stderr}`);
});
Sie können es auch mit Versprechen verwenden:
const util = require('util');
const exec = util.promisify(require('child_process').exec);
async function ls() {
const { stdout, stderr } = await exec('ls');
console.log('stdout:', stdout);
console.log('stderr:', stderr);
}
ls();
Wenn Sie die Daten schrittweise in Blöcken empfangen möchten (Ausgabe als Stream), verwenden Sie child_process.spawn
:
const { spawn } = require('child_process');
const child = spawn('ls', ['-lh', '/usr']);
// use child.stdout.setEncoding('utf8'); if you want text chunks
child.stdout.on('data', (chunk) => {
// data from standard output is here as buffers
});
// since these are streams, you can pipe them elsewhere
child.stderr.pipe(dest);
child.on('close', (code) => {
console.log(`child process exited with code ${code}`);
});
Beide Funktionen haben ein synchrones Gegenstück. Ein Beispiel für child_process.execSync
:
const { execSync } = require('child_process');
// stderr is sent to stderr of parent process
// you can set options.stdio if you want it to go elsewhere
let stdout = execSync('ls');
Sowie child_process.spawnSync
:
const { spawnSync} = require('child_process');
const child = spawnSync('ls', ['-lh', '/usr']);
console.log('error', child.error);
console.log('stdout ', child.stdout);
console.log('stderr ', child.stderr);
Hinweis: Der folgende Code ist weiterhin funktionsfähig, richtet sich jedoch hauptsächlich an Benutzer von ES5 und früheren Versionen.
Das Modul zum Laichen untergeordneter Prozesse mit Node.js ist in der Dokumentation (v5.0.0) gut dokumentiert . Verwenden Sie Folgendes, um einen Befehl auszuführen und seine vollständige Ausgabe als Puffer abzurufen child_process.exec
:
var exec = require('child_process').exec;
var cmd = 'prince -v builds/pdf/book.html -o builds/pdf/book.pdf';
exec(cmd, function(error, stdout, stderr) {
// command output is in stdout
});
Wenn Sie Handle-Prozess-E / A für Streams verwenden müssen, z. B. wenn Sie große Ausgabemengen erwarten, verwenden Sie child_process.spawn
:
var spawn = require('child_process').spawn;
var child = spawn('prince', [
'-v', 'builds/pdf/book.html',
'-o', 'builds/pdf/book.pdf'
]);
child.stdout.on('data', function(chunk) {
// output will be here in chunks
});
// or if you want to send output elsewhere
child.stdout.pipe(dest);
Wenn Sie eine Datei anstelle eines Befehls ausführen, möchten Sie möglicherweise verwenden child_process.execFile
, welche Parameter fast identisch sind spawn
, aber einen vierten Rückrufparameter haben, wie exec
zum Abrufen von Ausgabepuffern. Das könnte ein bisschen so aussehen:
var execFile = require('child_process').execFile;
execFile(file, args, options, function(error, stdout, stderr) {
// command output is in stdout
});
Ab Version 0.11.12 unterstützt Node jetzt synchrones spawn
und exec
. Alle oben beschriebenen Methoden sind asynchron und haben ein synchrones Gegenstück. Die Dokumentation dazu finden Sie hier . Beachten Sie, dass die synchronen Methoden im Gegensatz zu den Methoden, mit denen untergeordnete Prozesse asynchron erzeugt werden, keine Instanz von zurückgeben, obwohl sie für die Skripterstellung nützlich sind ChildProcess
.