2010-09-10 32 views

Trả lời

17

Sử dụng Daemonize.rb

require 'daemons' 
Daemons.daemonize 

mẫu Rất đơn giản: http://github.com/utkarsh2012/backitup/blob/master/backitup.rb

Làm thế nào để cài đặt daemon đá quý:

gem install daemons 
+0

Đây có thể là một câu hỏi ngu ngốc, nhưng đâu là tập tin daemonize.rb? Nó là một viên ngọc, có một nơi trên web nơi tôi có thể tìm thấy nó, nó là thư viện chuẩn, hay cái gì? – agentbanks217

+0

Đó là một viên ngọc. Bạn chỉ cần cài đặt và bắt đầu sử dụng nó. – zengr

+0

Ok cảm ơn rất nhiều. – agentbanks217

3

Đây là một module để daemonize mã của bạn. Đây là một offshoot kết thúc tốt đẹp một tập lệnh hiện có.

Về cơ bản nó nắm này (từ Daemonize.rb Travis Whitton của, liên kết đầu tiên ở trên, sửa đổi cho một số chương trình tôi đã viết từ lâu):

private 
# This method causes the current running process to become a daemon 
# If closefd is true, all existing file descriptors are closed 
def daemonize(pathStdErr, oldmode=0, closefd=false) 
    srand # Split rand streams between spawning and daemonized process 
    safefork and exit# Fork and exit from the parent 

    # Detach from the controlling terminal 
    unless sess_id = Process.setsid 
     raise 'Cannot detach from controlled terminal' 
    end 

    # Prevent the possibility of acquiring a controlling terminal 
    if oldmode.zero? 
     trap 'SIGHUP', 'IGNORE' 
     exit if pid = safefork 
    end 

    Dir.chdir "/" # Release old working directory 
    File.umask 0000 # Insure sensible umask 

    if closefd 
     # Make sure all file descriptors are closed 
     ObjectSpace.each_object(IO) do |io| 
      unless [STDIN, STDOUT, STDERR].include?(io) 
       io.close rescue nil 
      end 
     end 
    end 

    STDIN.reopen "/dev/null"  # Free file descriptors and 
    STDOUT.reopen "/dev/null" # point them somewhere sensible 
    STDERR.reopen pathStdErr, "w"   # STDOUT/STDERR should go to a logfile 
    return oldmode ? sess_id : 0 # Return value is mostly irrelevant 
end 

# Try to fork if at all possible retrying every 5 sec if the 
# maximum process limit for the system has been reached 
def safefork 
    tryagain = true 
    while tryagain 
     tryagain = false 
     begin 
      if pid = fork 
       return pid 
      end 
     rescue Errno::EWOULDBLOCK 
      sleep 5 
      tryagain = true 
     end 
    end 
end 
+0

Mark, trong khi điều này là đúng sự mã cho nhiều hệ thống Unix vani, và nó sẽ ít nhiều hoạt động trên Mac OS X, nó thực sự không phải là công thức đúng ... Tôi không có một công thức đóng hộp tiện dụng để đăng ký một tập lệnh ruby ​​với launchd, nhưng đó là những gì OP có lẽ nên tìm kiếm. :-) –

+0

@Kaelin, điểm xuất sắc. Tôi nên đọc câu hỏi cẩn thận hơn. Thật không may, tôi không có gì về không có máy Mac ... – Mark

+0

giải thích tuyệt vời. – zee

4

Ah, Google để giải thoát! Kiểm tra

http://fitzgeraldsteele.wordpress.com/2009/05/04/launchd-example-start-web-server-at-boot-time/

trong đó một blogger hữu ích cung cấp một ví dụ về cách viết một plist launchd để khởi động một máy chủ ruby ​​ứng dụng Web.

+0

Rất vui vì bạn nghĩ nó hữu ích! Cá nhân tôi đã đến như launchd ... vì nó có thể khởi động lại quá trình của bạn nếu nó chết bất ngờ. – fitzgeraldsteele

27

của Ruby 1.9.x bây giờ như sau:

Process.daemon 

Đặt mã vào mã của bạn và thế là xong.

Lấy từ "Daemon Processes in Ruby".

+1

Nó không hoạt động trên Windows. – Olathe

3

Cần để xem daemon-ray đá quý cho Rails 3 (dựa trên rails_generator):

https://github.com/mirasrael/daemons-rails

Có thể tạo daemon còn sơ khai như thế này:

rails generate daemon <name> 

Các tính năng:

  • cá nhân con kịch bản trol mỗi daemon
  • cào: lệnh daemon mỗi daemon
  • capistrano thân thiện
  • ứng dụng rộng kiểm soát kịch bản
  • giám sát API
  • nhiều daemon có thể đặt
Các vấn đề liên quan