2013-04-05 26 views

Trả lời

16

Tôi nghĩ cách duy nhất là giữ một tham chiếu đến đối tượng ChildProcess được trả về bởi spawn và hủy bỏ khi bạn thoát khỏi quy trình tổng thể.

Một ví dụ nhỏ:

var spawn  = require('child_process').spawn; 
var children = []; 

process.on('exit', function() { 
    console.log('killing', children.length, 'child processes'); 
    children.forEach(function(child) { 
    child.kill(); 
    }); 
}); 

children.push(spawn('/bin/sleep', [ '10' ])); 
children.push(spawn('/bin/sleep', [ '10' ])); 
children.push(spawn('/bin/sleep', [ '10' ])); 

setTimeout(function() { process.exit(0) }, 3000); 
+0

trên mac của tôi, bất kỳ quá trình con nào bắt đầu bằng cách đẻ trứng đều bị giết khi quá trình nút chính kết thúc. Có lẽ đây là hệ điều hành cụ thể? – AndyD

+0

Trên máy Mac của tôi (10.8.3), chúng tiếp tục: với đoạn mã trên, khi tôi nhận xét 'child.kill()', một thời gian ngắn (cho đến khi 10 giây được dựng lên) thấy ba quy trình 'sleep' ở đầu ra của 'ps' sau khi quá trình tổng thể đã dừng lại (mặc dù các quá trình đó được kết nối với đầu cuối bộ điều khiển của vỏ; khi tôi giết vỏ, chúng đã biến mất). – robertklep

+1

Thú vị. Quá trình con tôi là một quá trình phantomjs. Có lẽ đó là hành vi khác nhau. Tôi sẽ sử dụng mã trên nếu nó thay đổi. (10.8.0) – AndyD

17

Để thêm vào câu trả lời @ robertklep của:

Nếu, như tôi, bạn muốn làm điều này khi Node đang bị giết bên ngoài, chứ không phải là sự lựa chọn riêng của mình , bạn phải làm một số thủ đoạn với các tín hiệu.

Điều quan trọng là lắng nghe bất kỳ (các) tín hiệu nào bạn có thể bị giết và gọi process.exit(), nếu không, nút theo mặc định sẽ không phát ra exit trên process!

var cleanExit = function() { process.exit() }; 
process.on('SIGINT', cleanExit); // catch ctrl-c 
process.on('SIGTERM', cleanExit); // catch kill 

Sau khi thực hiện việc này, bạn chỉ có thể nghe exit trên process bình thường.

Vấn đề duy nhất là SIGKILL không thể bị bắt, nhưng đó là do thiết kế. Bạn phải là kill ing với SIGTERM (mặc định).

Xem this question để biết thêm.

Các vấn đề liên quan