2015-06-08 29 views
8

Tôi đang sử dụng child_process.spawn() để bắt đầu một tập lệnh từ ứng dụng Node.JS của tôi chạy trên Ubuntu. Theo như tôi biết, các quy trình nix tiêu chuẩn hoặc được sinh ra thường không chết khi bố mẹ chết, nhưng khi sinh ra các quá trình từ Node.JS, chúng dường như bị giết khi ứng dụng của tôi bị treo, hoặc bị hủy bỏ với ctrl-c vv .Node.JS quá trình con bị giết khi cha mẹ chết

Tại sao điều này và có cách nào đó? Tôi dường như không thể tìm thấy bất kỳ tùy chọn rõ ràng nào trong API child_process. Ứng dụng của tôi bắt đầu một số nhiệm vụ khá dài chạy trong nền và nếu máy chủ nút của tôi bị lỗi hoặc được khởi động lại vì một lý do nào khác mà tôi không muốn làm gián đoạn công việc, thay vào đó tôi muốn máy chủ nút trở lại và duyên dáng tiếp tục theo dõi tiến độ của những nhiệm vụ đang chạy.

Trả lời

17

bạn cần phải thiết lập các tùy chọn tách

Nếu tùy chọn tách ra được thiết lập, quá trình con sẽ được thực hiện lãnh đạo của một nhóm quy trình mới. Điều này khiến trẻ có thể tiếp tục chạy sau khi thoát gốc.

var child = spawn('prg', [], { 
    detached: true, 
    stdio: [ 'ignore', out, err ] 
}); 
+2

Cảm ơn rất nhiều. Không biết LÀM THẾ NÀO tôi đã quên mất điều đó. Để tham khảo, nếu bất kỳ ai khác tìm thấy câu trả lời này hữu ích, đây là từ hướng dẫn: https://nodejs.org/api/child_process.html#child_process_options_detached – JHH

+0

Tôi có một mối quan ngại. Hướng dẫn - và mã của bạn - cụ thể nói rằng stdio phải được chuyển hướng đến nơi khác hơn là với tiến trình cha (mặc định) cho quá trình tiếp tục trong nền. Tuy nhiên, tôi thấy rằng ngay cả khi tôi không chỉ định bất kỳ tùy chọn stdio nào, quá trình này vẫn còn tiếp tục ngay cả sau khi tôi đã giết máy chủ nút của mình. Tôi không chắc chính xác những gì đang xảy ra ở đây, nhưng có lẽ ['bỏ qua', 'bỏ ​​qua', 'bỏ ​​qua'] là một lựa chọn khôn ngoan. – JHH

+1

không chỉ định stdio sẽ mặc định là stdio: ['pipe', 'pipe', 'pipe'] ... có nghĩa là các đường ống có sẵn thông qua ChildProcess.stdin, ChildProcess.stdout và ChildProcess.stderr (trong trường hợp này ** I suy nghĩ ** bạn phải đọc từ stdout và stderr nếu không quy trình con của bạn có thể treo) ... nếu bạn không cần tương tác với stdio của childprosess từ tiến trình cha, thì bạn có thể sử dụng 'ignore' để chuyển tiếp bất kỳ đầu ra nào từ childprocess đến/dev/null – Johny

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