Mind to Code

I code and talk about it

Crontab Einer Rails-Anwendung Verwalten Mit Whenever

| Comments

Hallo zusammen,

heute hatte ich die Aufgabe, für eine unserer Webanwendungen regelmäßig laufende Aufgaben zu schreiben. Einmal täglich soll ein Prozess angestoßen werden, der an bestimmte Benutzergruppen der Anwendung eine E-Mail versendet.

Mein üblicher Blick in die Ruby Toolbox hat mir zu diesem Zweck whenever vorgeschlagen. Dieser Gem erlaubt es, in einer einfachen Ruby- DSL, Cron-Einträge zu definieren. Nun bin ich durchaus in der Lage, eine Crontab von Hand zu schreiben, was also ist der Vorteil dieses Gems?

Whenever erlaubt es, nicht nur Konsolenbefehle aufzurufen, sondern auch Rake-Tasks und sogar direkt Methoden des Ruby-Projekts. Die letzten beiden werden dann beim Generieren der Crontab automatisch um den Aufruf von rake bzw. ruby erweitert. Aus der kurzen Anweisung

1
runner "UserProfile.send_spam_to_all"

wird

1
/bin/bash -l -c 'cd /langer/pfad/zur/anwendung && script/rails runner -e production '''UserProfile.send_spam_to_all'''

generiert. Der Vorteil liegt also darin, dass man weniger kryptischen Code tippen muss, sich also auch weniger vertippen kann. Außerdem wird der Anwendungs-Pfad automatisch korrekt erzeugt. Wenn also die Anwendung auf den Produktiv-Server an anderer Stelle liegt, als auf dem Entwickler-Rechner (wovon ich mal ausgehe), muss man den Pfad in einer statischen Crontab nicht anpassen.

Auf die Lesbarkeit der Zeit-Einträge hat der Erfinder von whenever, sehr Ruby-typsch, ebenfalls viel Wert gelegt. Statt eines Cron-Eintrags ala 37 2 * * * schreibt man 

1
every 1.day, :at => '2:37 am'

Vollständig sieht ein Eintrag dann so aus:

1
2
3
every 1.day, :at => '2:37 am' do
  runner "UserProfile.send_spam_to_all"
end

Besonders durchdacht finde ich allerdings die Einbindung in den Deployment- Prozess. Durch nur eine neue Zeile in der Capistrano-Konfiguration wird die Crontab auf dem Server automatisch erzeugt und aktiviert. Ein weiterer Punkt, den man nicht mehr vergessen kann.

Ich muss sagen, whenever gefällt mir ziemlich gut. Keine Atomphysik, aber ein weiteres praktisches Tool für meine Ruby-Sammlung. Mal sehen, ob es beim echten Deployment hält, was es bisher verspricht.

Gruß
Marc

Comments