Untuk versi Node.js yang lebih baru (v8.1.4), acara dan panggilannya serupa atau identik dengan versi yang lebih lama, tetapi dianjurkan untuk menggunakan fitur bahasa standar yang lebih baru. Contoh:
Untuk buffer, output diformat non-aliran (Anda mendapatkan semuanya sekaligus), gunakan 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}`);
});
Anda juga dapat menggunakannya dengan Janji:
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();
Jika Anda ingin menerima data secara bertahap dalam potongan (output sebagai aliran), gunakan 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}`);
});
Kedua fungsi ini memiliki mitra sinkron. Contoh untuk 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');
Dan juga 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);
Catatan: Kode berikut masih berfungsi, tetapi utamanya ditargetkan untuk pengguna ES5 dan sebelumnya.
Modul untuk memunculkan proses anak dengan Node.js didokumentasikan dengan baik dalam dokumentasi (v5.0.0). Untuk menjalankan perintah dan mengambil output lengkapnya sebagai buffer, gunakan 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
});
Jika Anda perlu menggunakan proses pegangan I / O dengan aliran, seperti ketika Anda mengharapkan sejumlah besar output, gunakan 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);
Jika Anda mengeksekusi file daripada perintah, Anda mungkin ingin menggunakan child_process.execFile
, yang mana parameter yang hampir identik spawn
, tetapi memiliki parameter callback keempat seperti exec
untuk mengambil buffer output. Itu mungkin terlihat sedikit seperti ini:
var execFile = require('child_process').execFile;
execFile(file, args, options, function(error, stdout, stderr) {
// command output is in stdout
});
Pada v0.11.12 , Node sekarang mendukung sinkron spawn
dan exec
. Semua metode yang dijelaskan di atas tidak sinkron, dan memiliki mitra sinkron. Dokumentasi untuk mereka dapat ditemukan di sini . Meskipun mereka berguna untuk skrip, perlu diketahui bahwa tidak seperti metode yang digunakan untuk menelurkan proses anak secara serempak, metode sinkron tidak mengembalikan turunan dari ChildProcess
.