Đối với phiên bản mới hơn của Node.js (v8.1.4), các sự kiện và cuộc gọi tương tự hoặc giống hệt với các phiên bản cũ hơn, nhưng chúng tôi khuyến khích sử dụng các tính năng ngôn ngữ mới hơn tiêu chuẩn. Ví dụ:
Đối với đầu ra được định dạng bộ đệm, không được phát trực tuyến (bạn nhận được tất cả cùng một lúc), hãy sử dụng 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}`);
});
Bạn cũng có thể sử dụng nó với Lời hứa:
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();
Nếu bạn muốn nhận dữ liệu dần dần theo từng khối (đầu ra dưới dạng luồng), hãy sử dụng 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}`);
});
Cả hai chức năng này có một đối tác đồng bộ. Một ví dụ cho 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');
Cũng như 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);
Lưu ý: Mã sau đây vẫn hoạt động, nhưng chủ yếu nhắm vào người dùng ES5 trở về trước.
Mô-đun để sinh ra các tiến trình con với Node.js cũng được ghi lại trong tài liệu (v5.0.0). Để thực thi một lệnh và tìm nạp đầu ra hoàn chỉnh của nó dưới dạng bộ đệm, hãy sử dụng 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
});
Nếu bạn cần sử dụng xử lý I / O xử lý với các luồng, chẳng hạn như khi bạn đang mong đợi một lượng lớn đầu ra, hãy sử dụng 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);
Nếu bạn đang thực thi một tệp chứ không phải lệnh, bạn có thể muốn sử dụng child_process.execFile
, tham số nào gần giống với spawn
nhưng có tham số gọi lại thứ tư như exec
để truy xuất bộ đệm đầu ra. Điều đó có thể trông hơi giống như thế này:
var execFile = require('child_process').execFile;
execFile(file, args, options, function(error, stdout, stderr) {
// command output is in stdout
});
Kể từ v0.11.12 , Node hiện hỗ trợ đồng bộ spawn
và exec
. Tất cả các phương pháp được mô tả ở trên là không đồng bộ và có một đối tác đồng bộ. Tài liệu cho họ có thể được tìm thấy ở đây . Mặc dù chúng rất hữu ích cho việc tạo kịch bản, nhưng lưu ý rằng không giống như các phương thức được sử dụng để sinh ra các tiến trình con không đồng bộ, các phương thức đồng bộ không trả về một thể hiện của ChildProcess
.