[[:mac|{{ :Apple.png?40|}}]]
===== Launchd Task Scheduler konfigurieren =====
Es gibt Aufgaben, welche man zB immer zur selben Zeit ausgeführt haben möchte oder vielleicht auch nur einmal zu einer bestimmten Zeit bzw während seiner Abwesenheit. In Mac OS gibt es dafür verschiedene Möglichkeiten: cron((http://de.wikipedia.org/wiki/Cron))-, launchd((http://de.wikipedia.org/wiki/Launchd))- und at((http://de.wikipedia.org/wiki/At_%28Unix%29))-Jobs. cron ist seit Mac OS 10.4 (Tiger) nicht mehr am Start und wurde von launchd ersetzt. Dieser Artikel beschreibt das Einrichten eines scheduled tasks über launchd.
launchd wurde bereits im Artikel [[:mac:launchd|-> Der launchd Prozess]] und in [[:mac:start_script|-> launchd Startskript]] in seiner Eigenschaft das Betriebssystem oder Dienste zu starten und zu überwachen näher beschrieben. Jetzt kommt noch die Eigenschaft hinzu, Skripts zu einem bestimmten Zeitpunkt zu starten. Für dieses Tutorial möchte ich beispielhaft ein Shell-Skript zu einem bestimmten Zeitpunkt ausführen, welches mir eine Datei auf dem Desktop anlegt. Die Datei soll die aktuelle Zeit beinhalten zu welcher die Datei angelegt wurde. Folgendes Skript kommt dafür zum Einsatz:
#!/bin/bash
if [ ! -f /Users/pronto/Desktop/schedule.txt ]
then
touch /Users/pronto/Desktop/schedule.txt
fi
echo `date` >> /Users/pronto/Desktop/schedule.txt
Das zentrale Konfigurations Skript hierfür ist wieder das launchd-Startskript, welches bereits im Artikel [[:mac:start_script|-> launchd Startskript]] verwendet wurde und mit einigen Modifikationen angewiesen wird, die Systemuhr im Auge zu behalten und zu einem festgelegten Zeitpunkt das og Skript auszuführen. launchd kennt dafür zwei Keys:
==== StartInterval: =====
Ein integer-Wert((http://de.wikipedia.org/wiki/Integer_%28Datentyp%29)) der launchd veranlasst den Job alle n-Sekunden zu starten.
Folgende launchd-Konfigurationsdatei führt das og Skript zB alle 10 Sekunden aus:
Label
org.prontosystems.scheduled 10 seconds
ProgramArguments
/usr/local/scripts/schedule.sh
RunAtLoad
StartInterval
10
Um das Skript zu aktivieren verwenden Sie das launchctl-Utility((http://de.wikipedia.org/wiki/Launchd#launchctl)):
$ launchctl load ~/Library/LaunchAgents/org.prontosystems.schedule.plist
Um das Skript wieder zu deaktivieren verwenden Sie das launchctl-Utility mit der Option >>unload<<:
$ launchctl unload ~/Library/LaunchAgents/org.prontosystems.schedule.plist
==== StartCalendarInterval: =====
In einem dictionary-Tag wird, basierend auf täglich, wöchentlich oder monatlich zu einem bestimmter Zeitpunkt zum Starten des Jobs festgelegt.
Um ein Skript zu einem bestimmten Zeitpunkt zu starten, benötigen Sie die >>StartCalendarInterval<< Anweisung im launchd Startskript. Folgendes Skript starten zB das og Skript am Sonntag, den 31.10 um 10:45:
Label
org.prontosystems.scheduled on Sun, 2010.10.31 at 12:00
ProgramArguments
/usr/local/scripts/schedule.sh
RunAtLoad
StartCalendarInterval
Hour
12
Minute
0
Month
10
Day
31
Um dem System die Existenz des Skripts bekannt zu machen, laden Sie es wieder mit dem launchctl-Utility:
$ launchctl load ~/Library/LaunchAgents/org.prontosystems.schedule.plist
Um das Skript wieder zu deaktivieren verwenden Sie das launchctl-Utility:
$ launchctl unload ~/Library/LaunchAgents/org.prontosystems.schedule.plist
==== Zeitschlüssel ====
launchd kennt folgende Zeitschlüssel im **StartCalendarInterval**:
Hour
Die Stunde in der der Job ausgeführt wird.
Minute
Die Minute in der der Job ausgeführt wird.
Month
Der Monat in welchem der Job ausgeführt wird.
Day
Der Tag an dem der Job ausgeführt wird
Weekday
Der Wochentag an dem der Job ausgeführt werden soll (0 = Sonntag, 1 = Montag ...)
==== Beispiele ====
Hier noch einige weitere Beispiele für periodische Startzeiten, welche die Anweisung in der og plist im dict-Tag ersetzen sollten:
Folgende Anweisung führt den Job zu jeder vollen Stunde aus:
StartCalendarInterval
Minute
0
Folgende Anweisung führt den Job jeden Montag um 12:00 Uhr aus:
StartCalendarInterval
Hour
12
Minute
0
Weekday
1
==== Ablageorte: ====
Ähnlich wie schon bei den Startskripts ist auch bei den Skripts für die zeitgesteuerte Ausführung der Ablageort ausschlaggebend, wann bzw. ob ein Job ausgeführt wird.
~/Library/LaunchAgents # → Userskript, Owner = $USER; wird nur ausgeführt, wenn $USER eingeloggt ist.
/Library/LaunchAgents # → Owner = root; wird nur ausgeführt, wenn ein (beliebiger) User eingeloggt ist
/Library/LaunchDaemons # → Owner = root; wird schon ausgeführt, wenn das System gestartet ist. Unabhängig davon, ob ein User angemeldet ist oder nicht.
==== Aktive Jobs anzeigen lassen ====
Um sich die aktiven Jobs anzeigen zu lassen, verwenden Sie wieder das >>launchctl<< Utility mit dem Parameter >>list<<:
$ launchctl list
Ihr Job wird in dieser Liste, sofern er aktiv ist, mit dem in der plist im Key >>Label<< gekennzeichneten String angezeigt. Wenn Sie das Kommando als normaler Benutzer ausführen, werden Ihnen die aktiven Jobs des Benutzers angezeigt (~/Library/LaunchAgents). Wenn Sie es als root ausführen (sudo), entsprechend die aktiven Jobs, die root gehören und in (/Library/Launch{Agents|Daemons} bzw. /System/Library/Launch{Agents|Daemons}) abgelegt sind.
==== Disabled Key vs. override.plist ====
Eine launchd plist kann einen optionalen Key >>Disabled<< mit den Werten >>true<< oder >>false<< beinhalten (false = Default). Existiert dieser Key und hat den Wert >>true<< wird diese plist beim Ausführen der Startobjekte ignoriert. Ist der Wert auf >>false<< gesetzt (oder schlicht nicht vorhanden) wird das Objekt das nächste mal geladen, wenn sich der Benutzer einloggt oder das System gestartet wird, je nachdem welche Art von Startobjekt es betrifft (Siehe: Ablageorte) oder unmittelbar, wenn das Kommando >>launchctl load<< auf die pilst ausgeführt wird.
Wird die plist mit dem Kommando >>launchctl -w load<< ausgeführt, wird das Objekt sofort ausgeführt, unabhängig davon, ob ein eventuell vorhandener Disabled-Key auf >>true<< oder >>false<< gesetzt ist. Frühere Versionen von Mac OS (≤ 10.5) haben dann den Wert des Disabled Keys direkt in der launchd plist editiert, ab Snow Leopard (10.6) wird ein entsprechender Eintrag in die Datei >>/var/db/launchd.db/com.apple.launchd/overrides.plist<< gesetzt, welcher das Objekt nun, unabhängig vom Wert des Disabled Keys bzw. dessen Vorhandensein, solange als aktiv markiert, bis es mit dem Kommando >>launchctl -w unload<< wieder als inaktiv markiert wird.
==== Beschränkungen: ====
**Note:** Beide Varianten haben das Problem, dass die Jobs **nicht** zur eingestellten Zeit ausgeführt werden, wenn sich das System im Sleep-Modus befindet. Ab 10.4 (Tiger) werden die Jobs aber immerhin dann ausgeführt, wenn das System aus dem Sleep-Modus kommt. Ist das System zum festgelegten Zeitpunkt ausgeschaltet, wird der Job auch dann nicht ausgeführt, wenn später das System wieder eingeschaltet wird!
**Verwandte Artikel:**
[[:mac:start_script|-> Apple Launchd Startskript erstellen]]
[[:tux:at|-> Der UNIX Task Scheduler »at«]]
[[:tux:cron|-> Der UNIX Task Scheduler »cron«]]
[[:mac:launchd|-> Der Apple launchd Prozess]]
--- //pronto 2010/10/31 02:01//
{{keywords>launchd launchctl scheduled task zeitgesteuert startinterval startcalendarinterval overrides.plist true false}}