Nó dễ dàng hơn nhiều bây giờ (6 năm sau)!
Spawn trả về một childObject , sau đó bạn có thể lắng nghe các sự kiện . Các sự kiện là:
- Lớp: ChildProcess
- Sự kiện: 'lỗi'
- Sự kiện: 'thoát'
- Sự kiện: 'đóng cửa'
- Sự kiện: 'ngắt kết nối'
- Sự kiện: 'tin nhắn'
Ngoài ra còn có một loạt các đối tượng từ childObject , chúng là:
- Lớp: ChildProcess
- child.stdin
- child.stdout
- child.stderr
- child.stdio
- child.pid
- child.connected
- child.kill ([signal])
- child.send (message [, sendHandle] [, callback])
- child.disconnect ()
Xem thêm thông tin tại đây về childObject: https://nodejs.org/api/child_process.html
Không đồng bộ
Nếu bạn muốn chạy quy trình của mình trong nền trong khi nút vẫn có thể tiếp tục thực thi, hãy sử dụng phương thức không đồng bộ. Bạn vẫn có thể chọn thực hiện các hành động sau khi quy trình của bạn hoàn thành và khi quy trình có bất kỳ đầu ra nào (ví dụ: nếu bạn muốn gửi đầu ra của tập lệnh cho máy khách).
child_process.spawn (...); (Nút 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);
});
Đây là cách bạn sử dụng phương thức callback + asynchronous :
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);
});
}
Sử dụng phương pháp trên, bạn có thể gửi mọi dòng đầu ra từ tập lệnh tới máy khách (ví dụ: sử dụng Socket.io để gửi từng dòng khi bạn nhận các sự kiện trên stdout
hoặc stderr
).
Đồng bộ
Nếu bạn muốn nút dừng những gì nó đang làm và đợi cho đến khi tập lệnh hoàn tất , bạn có thể sử dụng phiên bản đồng bộ:
child_process.spawnSync (...); (Nút v0.11.12 +)
Các vấn đề với phương pháp này:
- Nếu tập lệnh mất một lúc để hoàn thành, máy chủ của bạn sẽ bị treo trong khoảng thời gian đó!
- Stdout sẽ chỉ được trả lại sau khi tập lệnh chạy xong . Bởi vì nó đồng bộ, nó không thể tiếp tục cho đến khi dòng hiện tại kết thúc. Do đó, nó không thể nắm bắt sự kiện 'stdout' cho đến khi dòng sinh sản kết thúc.
Làm thế nào để sử dụng nó:
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
sau đó đừng quên để vượt qua-u
lá cờ cho nó không đệm console đầu ra, nếu không nó sẽ trông giống như kịch bản không phải là sống stackoverflow.com/a/49947671/906265