Per la versione ancora più recente di Node.js (v8.1.4), gli eventi e le chiamate sono simili o identici alle versioni precedenti, ma si consiglia di utilizzare le funzionalità del linguaggio più recenti standard. Esempi:
Per l'output formattato buffer, non stream (ottieni tutto in una volta), usa 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}`);
});
Puoi anche usarlo con Promises:
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();
Se si desidera ricevere i dati gradualmente in blocchi (output come flusso), utilizzare 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}`);
});
Entrambe queste funzioni hanno una controparte sincrona. Un esempio per 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');
Oltre a 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);
Nota: il seguente codice è ancora funzionante, ma è principalmente destinato agli utenti di ES5 e precedenti.
Il modulo per la generazione di processi figlio con Node.js è ben documentato nella documentazione (v5.0.0). Per eseguire un comando e recuperare l'output completo come buffer, utilizzare 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
});
Se è necessario utilizzare l'I / O del processo di gestione con flussi, ad esempio quando si prevedono grandi quantità di output, utilizzare 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);
Se si sta eseguendo un file anziché un comando, è possibile che si desideri utilizzare child_process.execFile
quali parametri sono quasi identici spawn
, ma ha un quarto parametro di callback come exec
per il recupero dei buffer di output. Potrebbe apparire un po 'così:
var execFile = require('child_process').execFile;
execFile(file, args, options, function(error, stdout, stderr) {
// command output is in stdout
});
A partire da v0.11.12 , Node ora supporta sincrono spawn
e exec
. Tutti i metodi sopra descritti sono asincroni e hanno una controparte sincrona. La documentazione per loro può essere trovata qui . Sebbene siano utili per gli script, tenere presente che, diversamente dai metodi utilizzati per generare i processi figlio in modo asincrono, i metodi sincroni non restituiscono un'istanza di ChildProcess
.