Befehle zeitgesteuert ausführen (at)

Terminal Icon

Wer, wie ich, von *NIX zu OS X gekommen ist, kennt vermutlich einige Möglichkeiten Befehle zeitgesteuert ausführen zu lassen, dafür haben wir ja schliesslich einen Computer, oder? Zuerst die gute Nachricht, OS X kennt, durch den “*NIX-Unterbau” eigentlich alle dieser Möglichkeiten. Die “schlechte” Nachricht ist, in einigen Fällen müssen wir OS X ausdrücklich erklären, dass wir diese Möglichkeiten nutzen möchten. In diesem Beitrag soll es um den Befehl at gehen.

Ich kann mich ehrlich gesagt nicht erinnern, dass ich jemals an einem *NIX-System gesessen wäre, welches at nicht “kannte”.

Für alle die at nicht kennen sollten, hier ein paar Beispiele zur Erläuterung.

Um das Ganze nicht zu kompliziert zu gestalten, nehmen wir einfach an, dass wir ein kurzes Shellscript namens leattest.sh mit folgendem Inhalt im Pfad /Users/Shared liegen haben:

#!/bin/bash
echo `date` >> /Users/Shared/myattest.txt

Nachdem wir es mit chmod u+x leattest.sh ausführbar gemacht haben, können wir loslegen.

Nehmen wir an, wir wollten dieses Shellscript in 10 Minuten ausführen, dann sieht der Befehl dazu so aus:

at -f /Users/Shared/leattest.sh now + 10 minutes

Wenn wir das Shellscript am nächsten Tag um die aktuelle Uhrzeit ausführen lassen möchten, dann benutzen wir

at -f /Users/Shared/leattest.sh tomorrow

Diesen Befehl könnten wir auch mit der Zeitangabe now + 24 hours formulieren.

Wenn wir nur eine Uhrzeit angeben, die am aktuellen Tag aber bereits verstrichen ist, dann geht at davon aus, dass wir den nächsten Tag meinen. Genaueres findet sich in der man-Page (`man at`).

Wer jetzt bereits angefangen haben sollte mit diesen Befehlen zu experimentieren, wird feststellen, dass atq zwar eine Liste der auszuführenden Jobs anzeigt, aber zum eingestellten Zeitpunkt nichts passiert. Der Grund findet sich in man atrun (`atrun` ist der Daemon der sich um die at-Jobs kümmert), der Daemon ist standardmässig deaktiviert.

Apple ist der Meinung, dass es nichts einfacheres und eleganteres gibt, als zeitgesteuerte Befehle über launchd mit XML zu konfigurieren. Über Geschmack lässt sich bekanntlich streiten, aber für einen einmaligen Job eine Plist zu schreiben ist mir einfach zuviel (bin faul und stehe dazu).

Wie können wir nun OS X mitteilen, dass wir gerne einen laufenden atrun haben möchten? Ganz einfach (steht auch so unter man atrun), wir müssen die Plist /System/Library/LaunchDaemons/com.apple.atrun.plist scharfschalten, und das geht so:

sudo launchctl load -w \
/System/Library/LaunchDaemons/com.apple.atrun.plist

Dann klappt’s auch mit atrun.

Viel Spass beim experimentieren und es gilt wie immer, ich kann keine Verantwortung dafür übernehmen, wenn sich jemand wichtige Daten zerschiesst. (Wann lief der letzte Backup?) 😉

Speak Your Mind

*