V minulém článku jsem vysvětlil, jak na démony v Ruby. Dnes vám ukážu využítí takového démona v Ruby on Rails aplikaci. Co takový démon dělá, je docela jedno. Řekněme, že si chceme pro účely statistiky uchovávat počet článků v nějakém blogovacím systému.
# post_counter.rb
#!/usr/bin/ruby
# pokud není nastavený environment tak nastav na development
ENV['RAILS_ENV'] ||= 'development'
# načtení environmentu - prakticky nám nabootuje Rails
require File.join(File.dirname(__FILE__), '..', 'config', 'environment')
log_file = File.join(File.dirname(__FILE__), '..', 'log', 'post_count.txt')
begin
file = File.open(log_file, 'w+')
loop do
count = Post.count
file.puts "V systému je #{count} článků."
file.flush
sleep(60)
end
ensure
file.close if file
end
Důležité jsou tu první řádky skriptu, kde zajistíš nabootování Rails aplikace k aktuálnímu procesu a dostaneš tak přístup k veškeré funkcionalitě Rails. Skript ale příliš démonický není a proto je potřeba vytvořit ještě spouštěcí skript, který už nám démona vytvoří.
# lib/post_counter_ctl.rb
require 'rubygems'
require 'daemons'
dir = File.dirname(__FILE__)
log = File.join(dir, '..', 'log')
opts = {
:app_name => "post_counter_daemon", # název démona
:dir_mode => :normal, # interpretuj :dir jako normální cestu
:dir => log, # logy a výstup ukládej sem
:log_output => false, # zahazuj výstup skriptu
:backtrace => true, # pokud sript spadna zaloguj vyjímku
:multiple => false, # pouze jedna instance
:monitor => true # pokud spadne spusť jej znovu
}
counter = File.join(dir, "post_counter.rb")
Daemons.run(counter, opts)
Tento skript už stačí jenom spustit pomocí:
$ ruby lib/post_counter_ctl.rb start
Díky :monitor => true máš zaručeno, že když nastane nějaká chyba a démon spadne, bude pak nastartován znova.
Kód k článku si můžeš stáhnout z githubu http://github.com/honzasterba/dobrykod/tree/master/demonicke-procesy-v-rails