2011-10-27 32 views
9

Tôi là một chút bối rối như thế nào để tạo daemon trong NodeJSforking trong NodeJS

Tôi đã tạo daemon trong C trước đó gọi fork() mà tiếp tục thực hiện từ nơi các cuộc gọi được thực hiện trong một quá trình con cho phép cha mẹ để chấm dứt. Tôi không thể dễ dàng đạt được ảnh hưởng tương tự bằng cách sử dụng process.fork()process.kill().

Các mã sau đây không làm những gì tôi mong đợi và phá vỡ:

var current_pid, cp = require('child_process'); 
current_pid = process.pid; 
cp.fork(''); 
process.kill(current_pid); 

Các lỗi sau đây được phát ra và tôi không thể làm việc ra sao hoặc những gì đang xảy ra:

node.js:202 
     throw e; // process.nextTick error, or 'error' event on first tick 
      ^
Error: read EBADF 
    at errnoException (net.js:589:11) 
    at Pipe.onread (net.js:335:20) 

Vấn đề cuộc gọi có vẻ là process.kill(). Loại bỏ điều này, cả hai quá trình tiếp tục chạy một cách hạnh phúc.

Tôi biết về daemon.node, nhưng điều này đã được tạo tại thời điểm child_process.fork() không tồn tại (v0.1.33 là phiên bản có sẵn khi daemon.node được viết). Bây giờ có một cách bản địa để ngã ba, vì vậy điều này sẽ không còn cần thiết nữa. (Ngoài ra, dường như đã bị hủy quá.)

Trả lời

9

child_process.fork()tên hoàn toàn gây hiểu lầm và không giống như C's fork().

According to the docs, nó thực hiện một kịch bản Node.js như một tiến trình con và thiết lập một kênh liên lạc giữa quá trình gọi điện và con. Đó là nó.

Sinh sản thực tế của quá trình con is done inside libuv, “Lớp nền tảng” của Node trong C và fork() không được hiển thị với tập lệnh Node.

Một đơn giản, cách nhiều-có thể làm tốt thêm daemonize chỉ sử dụng những gì đang được xây dựng-in để Node.js có thể trông như thế này:

if (process.argv[2] !== 'child') { 
    require('child_process').execFile(process.argv[0], [__filename, 'child']); 
    process.exit(); 
} 

setTimeout(function(){ 
    console.log('foo'); 
}, 5000); 

Rõ ràng, điều này là khá khác nhau từ fork(). Nếu daemon.node hoạt động cho bạn, hãy tiếp tục sử dụng nó.