Làm thế nào để giết tất cả các tiến trình con (sinh ra bằng child_process.spawn) khi thoát khỏi quá trình node.js?Làm thế nào để giết tất cả các tiến trình con khi thoát?
Trả lời
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);
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
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
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
Để 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.
- 1. Cách nào đúng để giết các tiến trình con trong perl trước khi thoát?
- 2. Làm thế nào để bạn liệt kê tất cả các tiến trình con trong python?
- 3. giết tất cả child_process khi quá trình nút bị giết
- 4. chờ quá trình cho đến khi tất cả các tiến trình con kết thúc?
- 5. Làm thế nào để giết tất cả các quá trình bên trong ruby Thor dừng lại?
- 6. Làm thế nào để giết/Chấm dứt tất cả quá trình chạy trên Sql Server 2008
- 7. Trong Python 2.5, làm thế nào để giết một tiến trình con?
- 8. Làm thế nào để tính toán việc sử dụng CPU của một tiến trình và tất cả các tiến trình con của nó trong Linux?
- 9. Leiningen - làm thế nào để giết quá trình con?
- 10. Các tiến trình con được tạo bằng fork() có tự động bị giết khi cha mẹ bị giết không?
- 11. Làm thế nào để theo dõi tất cả các tệp được mở bởi một tiến trình và các tiến trình con của nó?
- 12. Giết chết một tiến trình con kể cả trẻ em từ python
- 13. móc bash tắt máy; hoặc, giết tất cả các quá trình nền khi quá trình chính là giết
- 14. Làm cho lệnh "Chờ" của linux đợi cho TẤT CẢ các tiến trình con
- 15. Làm thế nào để hạn chế thời gian thực hiện của chương trình khi sử dụng tiến trình con?
- 16. Làm thế nào để loại bỏ tất cả các chuỗi thoát khỏi danh sách các chuỗi?
- 17. Tôi làm cách nào để liệt kê tất cả các tiến trình đang chạy trong Windows?
- 18. Làm thế nào để bạn giết tất cả các quy trình Linux cũ hơn một độ tuổi nhất định?
- 19. giết subprocess khi quá trình python bị giết?
- 20. Java ProcessBuilder process.destroy() không giết chết các tiến trình con trong winXP
- 21. Làm thế nào để bạn sinh ra một tiến trình con trong Ruby?
- 22. làm thế nào để giết con của ngã ba?
- 23. Làm thế nào để tách một tiến trình con sinh ra trong một kịch bản Node.js?
- 24. Làm thế nào để chọn tất cả các nút gốc hoặc tất cả các nút con trong VirtualStringTree?
- 25. Làm cách nào để loại bỏ các quy trình con Java khi ứng dụng Java của tôi thoát/bị treo?
- 26. Làm thế nào để một tiến trình cha mẹ gửi đối tượng socket/server tới tiến trình con trong Node.js?
- 27. Làm cách nào để tìm tất cả các quy trình con?
- 28. Làm thế nào để giết các quy trình theo tên? (Win32 API)
- 29. C# Giết tất cả chủ đề
- 30. Làm thế nào để che giấu sản lượng của tiến trình con bằng Python 2.7
[Tham khảo trang này] (http://stackoverflow.com/questions/5266152/how-to-exit-in-node-js) – karthick