Tôi muốn viết một chương trình Ruby sẽ luôn chạy trong nền (một daemon) trên máy Mac của tôi.Tạo chương trình Ruby làm daemon?
Ai đó có thể chỉ cho tôi đúng hướng về cách thực hiện việc này không?
Tôi muốn viết một chương trình Ruby sẽ luôn chạy trong nền (một daemon) trên máy Mac của tôi.Tạo chương trình Ruby làm daemon?
Ai đó có thể chỉ cho tôi đúng hướng về cách thực hiện việc này không?
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
Đâ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
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. :-) –
@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
giải thích tuyệt vời. – zee
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.
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
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".
Nó không hoạt động trên Windows. – Olathe
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:
Đâ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
Đó là một viên ngọc. Bạn chỉ cần cài đặt và bắt đầu sử dụng nó. – zengr
Ok cảm ơn rất nhiều. – agentbanks217