Inhaltsverzeichnis

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: cron1)-, launchd2)- und at3)-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 -> Der launchd Prozess und in -> 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:

/usr/local/scripts/schedule.sh

#!/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 -> 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-Wert4) der launchd veranlasst den Job alle n-Sekunden zu starten.

Folgende launchd-Konfigurationsdatei führt das og Skript zB alle 10 Sekunden aus:

~/Library/LaunchAgents/org.prontosystems.schedule.plist

<?xml version="1.0" encoding="UTF-8"?>                       
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST
1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	    <string>org.prontosystems.scheduled 10 seconds</string>
	<key>ProgramArguments</key>
	    <array>
	        <string>/usr/local/scripts/schedule.sh</string>
	    </array>
	<key>RunAtLoad</key>
	    <false/>
	<key>StartInterval</key>
            <integer>10</integer>
</dict>
</plist>

Um das Skript zu aktivieren verwenden Sie das launchctl-Utility5):

$ 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:

~/Library/LaunchAgents/org.prontosystems.schedule.plist

<?xml version="1.0" encoding="UTF-8"?>                       
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST
1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	    <string>org.prontosystems.scheduled on Sun, 2010.10.31 at 12:00</string>
	<key>ProgramArguments</key>
	    <array>
	        <string>/usr/local/scripts/schedule.sh</string>
	    </array>
	<key>RunAtLoad</key>
	    <false/>
	<key>StartCalendarInterval</key> 
            <dict> 
                <key>Hour</key> 
                <integer>12</integer> 
                <key>Minute</key> 
                <integer>0</integer> 
                <key>Month</key> 
                <integer>10</integer> 
                <key>Day</key> 
                <integer>31</integer>  
            </dict>
</dict>
</plist>

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:

StartCalendarInterval

<integer>Hour</integer>
Die Stunde in der der Job ausgeführt wird.
 
<integer>Minute</integer>
Die Minute in der der Job ausgeführt wird.
 
<integer>Month</integer>
Der Monat in welchem der Job ausgeführt wird.
 
<integer>Day</integer>
Der Tag an dem der Job ausgeführt wird 
 
<integer>Weekday</integer>
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:

Ausführung zu jeder vollen Stunde

<key>StartCalendarInterval</key>
<dict>
  <key>Minute</key>
  <integer>0</integer>
</dict>

Folgende Anweisung führt den Job jeden Montag um 12:00 Uhr aus:

Ausführung jeden Montag 12:00 Uhr

<key>StartCalendarInterval</key>
<dict>
  <key>Hour</key>
  <integer>12</integer>
  <key>Minute</key>
  <integer>0</integer>
  <key>Weekday</key>
  <integer>1</integer>
</dict>

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.

Speicherorte:

~/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:
-> Apple Launchd Startskript erstellen
-> Der UNIX Task Scheduler »at«
-> Der UNIX Task Scheduler »cron«
-> Der Apple launchd Prozess

pronto 2010/10/31 02:01