2010-03-23 28 views
37

Tôi đang viết kịch bản khởi động ruby ​​cho một dự án trường học, và một phần của quá trình khởi động này là bắt đầu một vài quy trình nền (được viết và hoạt động đúng). Những gì tôi muốn làm là một cái gì đó dọc theo các dòng:Tạo ra một quá trình nền trong Ruby

`/path/to/daemon1 &` 
`/path/to/daemon2 &` 
`/path/to/daemon3 &` 

Tuy nhiên, điều đó sẽ chặn cuộc gọi đầu tiên thực thi daemon1. Tôi đã thấy các tham chiếu đến phương thức Process.spawn, nhưng điều đó có vẻ là một tính năng 1.9+ và tôi bị giới hạn ở Ruby 1.8.

Tôi cũng đã cố thực thi các trình tiện ích này từ các luồng khác nhau, nhưng tôi muốn tập lệnh khởi động của mình có thể thoát.

Vậy làm cách nào để tôi có thể bắt đầu các quy trình nền này sao cho tập lệnh khởi động của tôi không chặn và có thể thoát (nhưng vẫn có các trình nền chạy trong nền)?

Trả lời

63

Miễn là bạn đang làm việc trên hệ điều hành POSIX, bạn có thể sử dụng forkexec.

fork = Tạo một tiến trình con

exec = Replace quá trình hiện tại với một quá trình

Sau đó bạn cần phải thông báo rằng chính quá trình của bạn là không quan tâm đến quy trình con tạo ra thông qua Process.detach.

job1 = fork do 
    exec "/path/to/daemon01" 
end 

Process.detach(job1) 

... 
+0

Nếu bạn đang tìm kiếm thứ gì đó lớn hơn (nhưng vẫn nằm trên cùng một máy chủ), hãy xem xét daemon_controller. http://blog.phusion.nl/2008/08/25/daemon_controller-a-library-for-robust-daemon-management/ – Levi

+1

Hoàn hảo! Tôi biết về 'fork' và' exec' (xuất phát từ nền C), nhưng đó là 'Process.detach()' mà tôi đã bỏ lỡ. Cảm ơn! –

+0

Điều này không hoạt động như mong đợi, đối với tôi, trên OSX Lion và ruby ​​được cài đặt sẵn. – nes1983

0

Vâng, nói về mặt kỹ thuật, bạn có thể, theo nghĩa đen:

`/path/to/daemon1 &` 
`/path/to/daemon2 &` 
`/path/to/daemon3 &` 

Nhưng điều đó sẽ không làm những gì bạn muốn nó làm, rõ ràng.

Tuy nhiên, bạn có thể cũng chỉ cần chuyển & làm đối số cho system (và bạn bè) và nó sẽ làm công việc.

0

tốt hơn cách để pseudo-deamonize:

`((/path/to/deamon1 &)&)` 

sẽ giảm quá trình này vào vỏ riêng của nó.

cách tốt nhất để thực sự daemonize:

`service daemon1 start` 

và chắc chắn rằng máy chủ/user có quyền khởi chạy trình nền thực tế. kiểm tra công cụ 'deamonize' cho Linux để thiết lập deamon của bạn.

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