วิธีการรันโปรแกรมภายนอกจากภายใน Node.js?


137

เป็นไปได้หรือไม่ที่จะรันโปรแกรมภายนอกจากภายใน node.js? มีเทียบเท่ากับ Python os.system()หรือห้องสมุดใด ๆ ที่เพิ่มฟังก์ชันนี้หรือไม่?


คุณต้องการใช้child_processโมดูล ดูเอกสารประกอบซึ่งมีตัวอย่างที่ชัดเจนของกรณีการใช้ที่หลากหลาย
Ken Rockot

คำตอบ:


140
var exec = require('child_process').exec;
exec('pwd', function callback(error, stdout, stderr){
    // result
});

2
เป็นวิธีที่ดีที่สุดในการดำเนินการตามกระบวนการของเด็กอะไร ตัวอย่าง ... หากกระบวนการส่งคืนรหัสออก 0 และฉันต้องการเรียกวิธีการอื่นฉันดูเหมือนจะพบข้อผิดพลาดมากมาย
Continuousqa

@continuousqa - คำตอบนี้มีอายุ 4 ปี หากคุณมีปัญหาโปรดโพสต์คำถามใหม่เกี่ยวกับ SO และอ้างอิงคำถามนี้หากจำเป็น
Mark Kahn

1
นี้บทความchild_processมีเคล็ดลับดีๆในการใช้
Adriano P

@ JoãoPimentelFerreira - คำถามนี้มีอายุ 7 ปี ฉันขอแนะนำให้เปิดใหม่หากคุณต้องการความช่วยเหลือ
Mark Kahn

75

exec มีข้อ จำกัด หน่วยความจำของขนาดบัฟเฟอร์ 512k ในกรณีนี้มันจะดีกว่าที่จะใช้วางไข่ ด้วยการวางไข่หนึ่งมีการเข้าถึง stdout ของคำสั่งดำเนินการในเวลาทำงาน

var spawn = require('child_process').spawn;
var prc = spawn('java',  ['-jar', '-Xmx512M', '-Dfile.encoding=utf8', 'script/importlistings.jar']);

//noinspection JSUnresolvedFunction
prc.stdout.setEncoding('utf8');
prc.stdout.on('data', function (data) {
    var str = data.toString()
    var lines = str.split(/(\r?\n)/g);
    console.log(lines.join(""));
});

prc.on('close', function (code) {
    console.log('process exit code ' + code);
});

1
ฉันใช้รหัสนี้และมันล้มเหลวในการแสดงผลลัพธ์ของกระบวนการที่เกิดขึ้นstackoverflow.com/questions/21302350/ …
พอล Verest

1
@PaulVerest: เอาท์พุทของคุณอาจได้รับในมากกว่าstderr stdoutในกรณีของฉันแม้ว่าcloseจะไม่มา ...
hippietrail

1
แล้ว stdin ล่ะ? เป็นไปได้ไหมที่จะส่งข้อมูลไปยังกระบวนการ
Hernán Eche

18

วิธีที่ง่ายที่สุดคือ:

const {exec} = require("child_process")
exec('yourApp').unref()

unrefจำเป็นต้องจบกระบวนการของคุณโดยไม่รอ "yourApp"

นี่คือไฟล์เอกสาร exec


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.