UNIX basierte Betriebssysteme kennen mehrere Möglichkeiten bestimmte Tasks zeitgesteuert auszuführen. »cron«1) ist einer der ältesten Dienste für diesen Zweck und wird hauptsächlich dann verwendet, wenn Jobs periodisch immer wieder ausgeführt werden sollen. »cron« wurde aber zB in Mac OS (Darwin) ab Version 10.4 (Tiger) von »launchd«2) abgelöst. Für Jobs die nur einmal zeitgesteuert ausgeführt werden sollen, bietet »at«3) jedoch eine schnelle Lösung.
Eine einfache Möglichkeit eine Datei zu einem bestimmten Zeitpunkt zu löschen, könnte in etwa so aussehen:
$ echo 'rm -f /tmp/test' | at 04:00pm
Auch ein ausführbares Shell Skript kann über diese Variante zeitgesteuert ausgeführt werden:
$ echo '/tmp/rmfile.sh' | at 04:00pm
Der Aufruf über »echo« hat den Vorteil, dass das abgesetzte Kommando später in der »history« zu finden ist!
Beim Aufruf von »at« kann man über einen at-Prompt die Queue auch direkt ansprechen. Es können sowohl Befehle direkt oder auch ein ausführbares Skript (mit absoluten Pfad) angegeben werden. Mit der Tastenkombination »CRTL+D« beenden Sie das at-Interface wieder:
$ at 04:00pm warning: commands will be executed using /bin/sh at> touch /tmp/test at> CTRL+D <EOT>
Eine weitere Variante zum Ausführen eines Skripts ist die Option »-f« mit der eine Datei übergeben werden kann:
$ at -f /tmp/touch.sh 04:00pm
Mit dem atq-Kommando kann man sich alle Jobs in der Queue anzeigen lassen:
$ atq
16 Sun Oct 31 16:00:00 2010 a root
Mit dem atrm-Kommando kann man Jobs anhand ihrer laufenden Nummer (16 im og Beispiel) aus der Queue entfernen:
$ atrm 16
»at« kennt einige vorkonfigurierte Zeitformate: »midnight«, »noon« oder »teatime« (16:00 Uhr oder 4pm) für bestimmte Zeitpunkte und »now«, »today« oder »tomorrow« für bestimmte Zeitabschnitte. Des Weiteren können diese Zeitformate mit weiteren Operatoren versehen werden: zB »now +10min« oder »teatime tomorrow«.
Weitere Informationen entnehmen Sie der at-Manpage4)
Sie können »at« auch hervorragend als Rettungsfallschirm verwenden, wenn Sie auf einem Remote Server zB an der Firewall arbeiten. Falls Ihnen ein Fehler bei der Firewall Konfiguration unterläuft und Sie sich selber aussperren, können Sie bevor Sie Ihre Firewall Regeln "scharf" machen, »at« anweisen in ein paar Minuten entweder die Regel wieder zu entfernen oder noch besser, fügen Sie eine vorgefertigte und getestete Regel ein, welche Ihnen garantiert wieder Zugang zum System verschafft. So eine Regel könnte zB so aussehen:
$ echo 'iptables -I INPUT -p tcp --dport 22 -j ACCEPT && iptables -I OUTPUT -p tcp --sport 22 -j ACCEPT' | at now + 10min
Dieser Befehl fügt 10 Minuten nach dem Absetzen eine iptables Regel in die INPUT/OUTPUT Chain, welche alle Pakete die zum/vom Port 22 (SSH) adressiert sind, zugelassen werden. Das »-I« sorgt dafür, dass die Regeln ganz oben an erster Stelle steht. Egal was Sie nun weiter unten im Regelsatz verbrochen haben, nach 10 Minuten haben Sie garantiert wieder Zugang über SSH auf Ihren Server. Waren Ihre Änderungen jedoch erfolgreich, können Sie noch vor Ablauf der 10 Minuten den at-Job mit »atrm« aus der at-Queue löschen und diese (Rettungs-) Regel wird erst gar nicht in die Firewall Konfiguration geschrieben.
Hinweis: In Mac OSX ist das at-Kommando zwar ebenfalls vorhanden, jedoch wird »at« über »atrun« ausgeführt, was standardmäßig deaktiviert ist! Zum aktivieren von »atrun« führen Mac OSX User das folgende Kommando einmalig aus:
$ sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.atrun.plist
Die Ausführung eines at-Jobs in Mac OSX wird ein paar Sekunden verzögert ausgeführt.
Befindet sich das System zum Zeitpunkt der geplanten Ausführung im Sleep Modus, wird der Job nicht zum angepeilten Zeitpunkt ausgeführt, sondern erst dann, wenn das System aus dem Sleep Modus geholt wird!