Làm cách nào để thực thi một chương trình bên ngoài từ bên trong Node.js?


137

Có thể thực thi một chương trình bên ngoài từ bên trong node.js không? Có tương đương với Python os.system()hoặc bất kỳ thư viện nào thêm chức năng này không?


Bạn muốn sử dụng child_processmô-đun. Xem tài liệu , trong đó cung cấp một số ví dụ rõ ràng về các trường hợp sử dụng khác nhau.
Ken Rockot

Câu trả lời:


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

2
Cách tốt nhất để hành động theo kết quả của quá trình con. Ví dụ ... nếu quy trình trả về mã thoát 0 và tôi muốn gọi một phương thức khác, tôi dường như gặp rất nhiều lỗi.
liên tục

@continuptqa - Câu trả lời này là 4 tuổi. Nếu bạn gặp vấn đề, xin vui lòng gửi câu hỏi mới về SO và tham khảo câu hỏi này nếu cần thiết.
Mark Kahn

1
Bài viết này có lời khuyên tốt về việc sử dụng child_process.
Adriano P

@ JoãoPimentelFerreira - Câu hỏi này 7 tuổi. Tôi đề nghị mở một cái mới nếu bạn cần giúp đỡ
Mark Kahn

75

exec có giới hạn bộ nhớ của kích thước bộ đệm là 512k. Trong trường hợp này tốt hơn là sử dụng sinh sản. Với spawn, người ta có quyền truy cập vào thiết bị xuất chuẩn của lệnh được thực thi trong thời gian chạy

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
Tôi đã lấy mã này và nó không hiển thị đầu ra của quá trình sinh sản stackoverflow.com/questions/21302350/
dọa

1
@PaulVerest: Đầu ra của bạn có thể đã được stderrthay vì stdout. Trong trường hợp của tôi mặc dù điều đó closesẽ không bao giờ đến ...
hà mã

1
còn stdin thì sao? Có thể gửi dữ liệu đến quá trình?
Hernán Eche

18

Cách đơn giản nhất là:

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

unref là cần thiết để kết thúc quá trình của bạn mà không cần chờ "yourApp"

Dưới đây là tài liệu exec


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.