Für Railsprozesse, die im Hintergrund asynchron Dinge erledigen sollen, sind ein paar Dinge ganz hilfreich:
- Subroutinen zeitlich zu begrenzen und ggf. auftretende Fehler abzufangen
- den Dienst selbst auf Steuersignale horchen zu lassen (hier Sig-Term)
- adäquate Logeinträge zu prodizieren.
Der folgende Schnipsel zeigt an einer Pdf-Konvertierung, wie man’s machen kann. Er kann als Daemon (in Zusammenhang mit dem daemons-gem) gestartet werden:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#!/usr/bin/env ruby # You might want to change this ENV["RAILS_ENV"] ||= "production" require File.dirname(__FILE__) + "/../../config/environment" $running = true Signal.trap("TERM") do $running = false end while($running) do pdfs = QAttachment.all.select {|qa| qa.content_type == 'application/pdf' && qa.answer.andand.value_str.blank?} pdfs.each do |f| if File.readable?(f.public_filename) begin timeout(60) do f.answer.value_str = `pdftotext -enc UTF-8 -q "#{f.public_filename}" -` end f.answer.value_str = 'PDF-ERROR' if f.answer.value_str.blank? rescue Timeout::Error f.answer.value_str = 'PDF-ERROR' end f.answer.save ActiveRecord::Base.logger.info "Pdf-Conversion failed for Attachment #{f.answer.id} at #{Time.now}.\n" if f.answer.value_str == 'PDF-ERROR' else f.destroy end end sleep 10 end |