ง่ายขึ้นมากตอนนี้ (6 ปีต่อมา)!
Spawn ส่งคืนchildObjectซึ่งคุณสามารถฟังเหตุการณ์ด้วย เหตุการณ์คือ:
- คลาส: ChildProcess
- เหตุการณ์: 'ข้อผิดพลาด'
- เหตุการณ์: 'exit'
- เหตุการณ์: 'ปิด'
- เหตุการณ์: 'ยกเลิกการเชื่อมต่อ'
- เหตุการณ์: 'ข้อความ'
นอกจากนี้ยังมีวัตถุอีกมากมายจาก childObjectได้แก่ :
- คลาส: ChildProcess
- child.stdin
- child.stdout
- child.stderr
- child.stdio
- child.pid
- เด็ก
- child.kill ([สัญญาณ])
- child.send (ข้อความ [, sendHandle] [, โทรกลับ])
- child.disconnect ()
ดูข้อมูลเพิ่มเติมเกี่ยวกับ childObject ได้ที่นี่: https://nodejs.org/api/child_process.html
อะซิงโครนัส
หากคุณต้องการเรียกใช้กระบวนการของคุณในเบื้องหลังในขณะที่โหนดยังคงสามารถดำเนินการต่อไปได้ให้ใช้วิธีอะซิงโครนัส คุณยังคงสามารถเลือกที่จะดำเนินการหลังจากกระบวนการของคุณเสร็จสิ้นและเมื่อกระบวนการมีผลลัพธ์ใด ๆ (เช่นหากคุณต้องการส่งเอาต์พุตของสคริปต์ไปยังไคลเอ็นต์)
child_process.spawn (... ); (โหนด 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);
});
นี่คือวิธีที่คุณจะใช้วิธีโทรกลับ + อะซิงโครนัส :
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);
});
}
ด้วยวิธีการข้างต้นคุณสามารถส่งเอาต์พุตทุกบรรทัดจากสคริปต์ไปยังไคลเอนต์ (ตัวอย่างเช่นใช้ Socket.io เพื่อส่งแต่ละบรรทัดเมื่อคุณได้รับเหตุการณ์ในstdout
หรือstderr
)
ซิงโครนัส
หากคุณต้องการให้โหนดหยุดสิ่งที่กำลังทำอยู่และรอจนกว่าสคริปต์จะเสร็จสมบูรณ์คุณสามารถใช้เวอร์ชันซิงโครนัส:
child_process.spawnSync (... ); (โหนด v0.11.12 +)
ปัญหาเกี่ยวกับวิธีนี้:
- หากสคริปต์ใช้เวลาสักครู่เซิร์ฟเวอร์ของคุณจะหยุดทำงานในช่วงเวลาดังกล่าว!
- stdout จะถูกส่งคืนเมื่อสคริปต์ทำงานเสร็จแล้วเท่านั้น เนื่องจากเป็นแบบซิงโครนัสจึงไม่สามารถดำเนินการต่อได้จนกว่าบรรทัดปัจจุบันจะเสร็จสิ้น ดังนั้นจึงไม่สามารถจับภาพเหตุการณ์ 'stdout' ได้จนกว่าการวางไข่จะเสร็จสิ้น
วิธีใช้:
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
อย่าลืมส่ง-u
แฟล็กเพื่อไม่ให้บัฟเฟอร์คอนโซลเอาท์พุทมิฉะนั้นจะดูเหมือนว่าสคริปต์ไม่อยู่ stackoverflow.com/a/49947671/906265