Bagaimana cara menjalankan program eksternal dari dalam Node.js?

137

Apakah mungkin untuk menjalankan program eksternal dari dalam node.js? Apakah ada yang setara dengan Python os.system()atau pustaka apa pun yang menambahkan fungsi ini?

Michael Bylstra
sumber
Anda ingin menggunakan child_processmodul. Lihat dokumentasinya , yang memberikan beberapa contoh jelas dari berbagai kasus penggunaan.
Ken Rockot

Jawaban:

140
var exec = require('child_process').exec;
exec('pwd', function callback(error, stdout, stderr){
    // result
});
Mark Kahn
sumber
2
Apa cara terbaik untuk bertindak sebagai hasil dari proses anak. Contoh ... jika proses mengembalikan kode keluar 0, dan saya ingin memanggil metode yang berbeda, sepertinya saya mengalami banyak kesalahan.
berkelanjutanqa
@continuousqa - Jawaban ini berumur 4 tahun. Jika Anda mengalami masalah, silakan posting pertanyaan baru di SO dan referensi yang satu ini jika perlu.
Mark Kahn
1
Artikel ini memiliki tip bagus dalam menggunakan child_process.
Adriano P
@ JoãoPimentelFerreira - Pertanyaan ini berumur 7 tahun. Saya sarankan membuka yang baru jika Anda membutuhkan bantuan
Mark Kahn
76

exec memiliki batasan memori dengan ukuran buffer 512k. Dalam hal ini lebih baik menggunakan spawn. Dengan spawn seseorang memiliki akses ke stdout dari perintah yang dieksekusi pada saat dijalankan

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);
});
MKK
sumber
1
Saya mengambil kode ini dan gagal menampilkan keluaran dari proses yang muncul stackoverflow.com/questions/21302350/…
Paul Verest
1
@PaulVerest: Output Anda mungkin telah di stderrbukan stdout. Dalam kasus saya meskipun closetidak pernah datang ...
hippietrail
1
bagaimana dengan stdin? apakah mungkin mengirim data ke proses?
Hernán Eche
18

Cara yang paling sederhana adalah:

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

unref diperlukan untuk mengakhiri proses Anda tanpa menunggu "AplikasiAnda"

Berikut adalah dokumen eksekutifnya

zag2art
sumber