Eigentlich wollte ich zum Testen des neuen ChatGPT 40 eine Kurzbefehl erstellen lassen, der auf „Knopfdruck“ meinen Obsidian Vault auf mein Synology NAS speichert. Nachdem wir eine Lösung erarbeitet hatten, kam die Frage auf, warum dieser Backup-Prozess nicht automatisch und periodisch ausgeführt werden solle.
ChatGPT 4o bot dazu eine Lösung an, bei der der Shortcut mithilfe eines Shell-Skripts über den Systemdienst launchd aufgerufen wird. launchd startet Programme oder Skripte automatisch u.a. auch zeitgesteuert. Es ist zwar etwas „over engineered“, einen Kommandozeilen-Befehl in einen Kurzbefehl zu verpacken und diesen dann wieder über ein Shell-Skript aufzurufen, anstatt direkt das Kommando in launchd anzumelden. Doch das Vorgehen fand ich interessant und da es nicht viele Informationen darüber im Netz gibt, habe ich diese kleine allgemeine Anleitung erstellt.
Schritt 1: Erstellen eines Kurzbefehls
Für diesen Artikel habe ich einen ganz einfachen Kurzbefehl erstellt, der die aktuelle Uhrzeit in der Mitteilungszentrale anzeigt:
Dabei habe ich das Ausgabeformat leicht angepasst, wie auf dem Bildschirmabgriff zu sehen ist.
Im Terminal kann nun getestet werden, ob der Kurzbefehl wie gewünscht funktioniert:
shortcuts run notify
Wenn das geklappt hat, kann der zweite Schritt in Angriff genommen werden.
Schritt 2: Skript für die Ausführung des Kurzbefehls erstellen
Zur Ausführung des Kurzbefehls mit launchd ist es am einfachsten den Aufruf in ein Shell-Skript zu verpacken, dass dann so aussieht:
#!/bin/bash /usr/bin/shortcuts run notify
Die Datei wird gespeichert, in meinem Beispiel unter/User/leif/Applications/notify.sh
, und dann im Terminal als ausführbar markiert:
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 werden. 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 ausführt.
- RunAtLoad: Stellt sicher, dass der Job beim Login in die Liste der Jobs geladen wird.
- StartInterval: Das Intervall in Sekunden, in dem der Job ausgefü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ächsten Befehl wird die Plist-Datei bei launchd registriert, damit dann Job gestartet kann.:
launchctl load ~/Library/LaunchAgents/com.leif.notify.plist
Danach wird der Job dann gestartet, was normalerweise 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 überprüfen:
launchctl list | grep com.leif.notify.plist
Falls irgendwas nicht fuktionieren sollte, finden sich entsprechende Hinweise in den oben definierten Log-Dateien.
Noch einige Hinweise
Um einen Job zu stoppen, wird er mit folgendem Befehl “entladen”:
launchctl unload ~/Library/LaunchAgents/com.leif.notify.plist
Dieser Befehl stoppt den Job und entfernt ihn aus der aktiven Liste der launchd
-Jobs.
Danach kann der Job mit dem Befehl ganz gelöscht werden:
rm ~/Library/LaunchAgents/com.leif.notify.plist
Es empfiehlt sich natürlich vorher eine Sicherheitskopie von der Plist-Datei zu machen.
Weitere Einstellungsmöglichkeiten, wie z.B. einen Job zu einem gewissen Zeitpunkt auszuführen, sind unter anderem hier A launchd Tutorial oder ausführlich hier About Daemons and Services beschrieben.
Schlusswort
Ich hoffe, dass ich mit dieser kleinen Anleitung helfen und zu weiteren Ideen inspirieren konnte. Meine Lösung für das Backup meines Vaults, das dann ohne den Umweg über die Kurzbefehle laufen soll, stelle ich in einem weiteren Beitrag vor. Bei eventuellen Fehlern, Ergänzungen oder anderen Bemerkungen sind die Kommentare offen.
Schreibe einen Kommentar