Un des problèmes avec une application Ruby on Rails est que lorsque pour une raison ou une autre, votre grappe de serveur mongrel part en vrille, il faut relancer le serveurs, en effaçant éventuellement les fichiers pids qui sont resté coincés ou en tuant les processus zombie dont le fichier pid ne se situe plus dans le dossier tmp/pids
Il existe pour cela le gem « god » : http://god.rubyforge.org/ – Seulement après un test sur un de nos serveurs, cela n’a pas été concluant car pour une obscure raison, le process god tombait et du coup je n’avais plus de monitoring pour mon application Ruby on Rails.
Créer un script qui surveille god qui lui même surveille notre application me semblait un peu étrange… Du coup j’ai décidé d’écrire un petit script qui vérifiera le status de l’application et redémarrera l’application en effaçant les pids et en tuant les process mongrels.
environment = "www"
mongrel_rails = "/usr/local/bin/mongrel_rails"
result = `cd #{environment}/current && #{mongrel_rails} cluster::status`.split("\n")
result = result.map{|r| r unless r == ""}.compact
check = result.map{|r| r =~ /^found/}.compact
pids = []
ports= []
result.each do |r|
pid = r.scan /pid (\d+)$/
pids << pid.to_s.to_i if pid.size > 0
port= r.scan /port (\d+)/
ports << port.to_s.to_i if port.size > 0
end
if check.size == result.size
puts "Server OK"
else
puts "Restarting mongrel Server"
`kill -9 #{pids.join(" ")}` if pids.size > 0
ports.each do |port|
pid = `pgrep -f #{port}`
`kill -9 #{pid}` if pid != ""
end
`rm #{environment}/current/tmp/pids/*`
`cd #{environment}/current && #{mongrel_rails} cluster::restart`
file = File.new("checkapp.log", "a")
file.write("Restarting mongrel serveur\n")
file.write("==========================\n")
file.write("#{Time.now}\n")
file.write("#{result.inspect}\n")
file.write("#{ports.inspect}\n")
file.write("#{pids.inspect}\n\n")
file.close
end
Vous pouvez le voir bien formaté sur github : http://gist.github.com/86819
Recent Comments