Periodische Ausführung von Apple Kurzbefehle mit launchd

Schwarz-weiße Linienzeichnung eines modernen Schreibtisch-Setups ohne Person. Der Computerbildschirm zeigt eine Schnittstelle zur Automatisierung wiederkehrender Aufgaben, die einen Flussdiagramm oder Zyklus zur Darstellung der periodischen Ausführung enthält. Der Schreibtisch ist mit Gadgets, einer Lampe, einer Kaffeetasse und Schreibwaren überladen. Im Hintergrund sind Regale und Fenster zu sehen, die eine detaillierte und dynamische Arbeitsplatzszene schaffen. created by DALL-E

Eigentlich woll­te ich zum Testen des neu­en ChatGPT 40 eine Kurzbefehl erstel­len las­sen, der auf „Knopfdruck“ mei­nen Obsidian Vault auf mein Synology NAS spei­chert. Nachdem wir eine Lösung erar­bei­tet hat­ten, kam die Frage auf, war­um die­ser Backup-Prozess nicht auto­ma­tisch und peri­odisch aus­ge­führt wer­den sol­le.

ChatGPT 4o bot dazu eine Lösung an, bei der der Shortcut mit­hil­fe eines Shell-Skripts über den Systemdienst launchd auf­ge­ru­fen wird. launchd star­tet Programme oder Skripte auto­ma­tisch u.a. auch zeit­ge­steu­ert. Es ist zwar etwas „over engi­nee­red“, einen Kommandozeilen-Befehl in einen Kurzbefehl zu ver­pa­cken und die­sen dann wie­der über ein Shell-Skript auf­zu­ru­fen, anstatt direkt das Kommando in launchd anzu­mel­den. Doch das Vorgehen fand ich inter­es­sant und da es nicht vie­le Informationen dar­über im Netz gibt, habe ich die­se klei­ne all­ge­mei­ne Anleitung erstellt.

Schritt 1: Erstellen eines Kurzbefehls

Für die­sen Artikel habe ich einen ganz ein­fa­chen Kurzbefehl erstellt, der die aktu­el­le Uhrzeit in der Mitteilungszentrale anzeigt:

Bildschirmaufnahme der macOS Shortcuts-App mit einem Kurzbefehl namens "notify". Der Kurzbefehl zeigt das aktuelle Datum an. Ein Dialogfenster mit dem Titel "Datum" ist geöffnet und zeigt Optionen zum Anzeigen und Entfernen des Datums, den Variablennamen, den Typ "Datum" und ein benutzerdefiniertes Datumsformat "HH:mm:ss". Auf der rechten Seite sind verschiedene Aktionsvorschläge zu sehen.

Dabei habe ich das Ausgabeformat leicht ange­passt, wie auf dem Bildschirmabgriff zu sehen ist.

Im Terminal kann nun getes­tet wer­den, ob der Kurzbefehl wie gewünscht funk­tio­niert:

shortcuts run notify

Wenn das geklappt hat, kann der zwei­te Schritt in Angriff genom­men wer­den.

Schritt 2: Skript für die Ausführung des Kurzbefehls erstellen

Zur Ausführung des Kurzbefehls mit launchd ist es am ein­fachs­ten den Aufruf in ein Shell-Skript zu ver­pa­cken, dass dann so aus­sieht:

#!/bin/bash
/usr/bin/shortcuts run notify

Die Datei wird gespei­chert, in mei­nem Beispiel unter/User/leif/Applications/notify.sh, und dann im Terminal als aus­führ­bar mar­kiert:

chmod +x /User/leif/Applications/notify.sh

Schritt 3: launchd-Plist-Datei erstellen

Zum Starten des Skriptes mit launchd wird eine Plist-Datei benö­tigt. Diese Datei muss im Verzeichnis ~/Library/LaunchAgents erstellt wer­den. Für mein Beispiel sieht sie so aus:

<?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>com.leif.notify.plist</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/leif/Applications/notify.sh</string>
    </array>
    <key>StartInterval</key>
    <integer>15</integer>
    <key>RunAtLoad</key>
    <true/>
    <key>StandardOutPath</key>
    <string>/tmp/notify.log</string>
    <key>StandardErrorPath</key>
    <string>/tmp/notify.err</string>
</dict>
</plist>

Erklärung der Einträge

  • Label: Der Name des Jobs.
  • ProgramArguments: Der Pfad zum Shell-Skript, das den Kurzbefehl aus­führt.
  • RunAtLoad: Stellt sicher, dass der Job beim Login in die Liste der Jobs gela­den wird.
  • StartInterval: Das Intervall in Sekunden, in dem der Job aus­ge­führt wird (hier: 15 Sekunden)
  • StandardOutPath/StandardErrorPath: Pfade zu den Dateien für die Ausgabe der Log-Informationen

Schritt 4: Starten des Jobs

Mit dem nächs­ten Befehl wird die Plist-Datei bei launchd regis­triert, damit dann Job gestar­tet kann.:

launchctl load ~/Library/LaunchAgents/com.leif.notify.plist

Danach wird der Job dann gestar­tet, was nor­ma­ler­wei­se durch die Angabe des Parameter RunAtLoad bei Systemstart geschieht.

launchctl start com.leif.notify.plist

Ob der Job läuft, läßt sich mit dem Befehl über­prü­fen:

launchctl list | grep com.leif.notify.plist

Falls irgend­was nicht fuk­tio­nie­ren soll­te, fin­den sich ent­spre­chen­de Hinweise in den oben defi­nier­ten Log-Dateien.

Noch einige Hinweise

Um einen Job zu stop­pen, wird er mit fol­gen­dem Befehl “ent­la­den”:

launchctl unload ~/Library/LaunchAgents/com.leif.notify.plist

Dieser Befehl stoppt den Job und ent­fernt ihn aus der akti­ven Liste der launchd-Jobs.

Danach kann der Job mit dem Befehl ganz gelöscht wer­den:

rm ~/Library/LaunchAgents/com.leif.notify.plist

Es emp­fiehlt sich natür­lich vor­her eine Sicherheitskopie von der Plist-Datei zu machen.

Weitere Einstellungsmöglichkeiten, wie z.B. einen Job zu einem gewis­sen Zeitpunkt aus­zu­füh­ren, sind unter ande­rem hier A launchd Tutorial oder aus­führ­lich hier About Daemons and Services beschrie­ben.

Schlusswort

Ich hof­fe, dass ich mit die­ser klei­nen Anleitung hel­fen und zu wei­te­ren Ideen inspi­rie­ren konn­te. Meine Lösung für das Backup mei­nes Vaults, das dann ohne den Umweg über die Kurzbefehle lau­fen soll, stel­le ich in einem wei­te­ren Beitrag vor. Bei even­tu­el­len Fehlern, Ergänzungen oder ande­ren Bemerkungen sind die Kommentare offen.

Eine Antwort zu „Periodische Ausführung von Apple Kurzbefehle mit launchd“

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert