So erstellen Sie einen LaunchAgent mit StartCalendarInterval

Ich möchte Crontabs durch LaunchAgents ersetzen. Mein erster Versuch funktioniert nicht.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.nocturnal.mcworldsBackup</string>
    <key>ProgramArguments</key>
    <array>
            <string>~/bin/mcworldsBackup.sh</string>
    </array>
    <key>StartCalendarInterval</key>
    <dict>
            <key>Hour</key>
            <integer>4</integer>
            <key>Minute</key>
            <integer>30</integer>
    </dict>
</dict>
</plist>

Das Skript mcworldsBackup.sh funktioniert eigenständig. Ich habe es dazu gebracht, bei jeder Ausführung einen Zeitstempel in einer Datei zu protokollieren, und bisher hat launchd es nicht ein einziges Mal ausgeführt.

Ich habe die Berechtigungen meiner Festplatte mit DiskUtility überprüft und repariert, die plist befindet sich in ~/Library/LaunchAgents/com.nocturnal.mcworldsBackup.plist mit den Berechtigungen 0644, genau wie alle anderen .plist-Dateien, die sich bereits darin befinden. Sie gehören mir alle: Mitarbeiter.

Wenn ich in /var/log/* nach mcworldsBackup.sh suche, finde ich nichts, keine Hinweise darauf, warum es nicht ausgeführt wird.

Nachdem ich die Plist zum ersten Mal erstellt habe, habe ich mich abgemeldet und wieder angemeldet und den Computer mehrmals neu gestartet, obwohl die Dokumentation besagt, dass Sie sich nur anmelden müssen.

Ich rätsle durch meine eigenen Launchd-Probleme, und eine Sache springt heraus: Haben Sie versucht, Ihre ProgramArguments zu ändern, um einen absoluten (im Gegensatz zu einem relativen) Pfadnamen zu verwenden? Ein Launchagent wird im Kontext eines Benutzers ausgeführt, Sie sollten also gut sein, aber es ist einen Versuch wert.
@shanusmagnus Danke für den Tipp, ich war mir nicht sicher, welche Umgebung oder Shell-Operatoren nach LaunchAgents exportiert wurden, aber ich habe letzte Nacht versucht, den vollständigen Pfad zum Skript anzugeben, also hätte es heute Morgen um 04:30 Uhr laufen sollen, es ist jetzt 09: 50 und nichts im Log. Das Skript ist jetzt bis auf eine Zeile echo $(date +%s) >> ~/mcworldsBackup.log komplett auskommentiert

Antworten (1)

Sie müssen den vollständigen Pfad in ProgramArguments angeben. Dinge, die Ihre Shell normalerweise erweitert, wie z. B. ~und *werden nicht erweitert durch launchd.

Nachdem ich diese Änderungen vorgenommen hatte, funktionierte dieser LaunchAgent für mich.

Sie sagten, Sie hätten diese Änderungen vorgenommen, aber es wurde nicht behoben. Es ist möglich, dass Sie den LaunchAgent nach den Änderungen nicht neu geladen haben.

Fehlerbehebung bei LaunchAgents

Sie können überprüfen, ob Ihr LaunchAgent derzeit geladen ist, indem Sie ihn ausführen

launchctl list | grep com.nocturnal.mcworldsBackup

Wenn es nicht läuft, können Sie es mit laden

launchctl load ~/Library/LaunchAgents/com.nocturnal.mcworldsBackup.plist

Wenn Sie Änderungen an der Plist-Datei vornehmen, müssen Sie sie mit entladen

luanchctl unload ~/Library/LaunchAgents/com.nocturnal.mcworldsBackup.plist

Sie müssen es dann erneut laden, indem Sie den Befehl von oben verwenden.

Wenn Sie den Start des LaunchAgent jetzt erzwingen möchten, anstatt bis 4:30 Uhr zu warten, können Sie ihn ausführen

launchctl start com.nocturnal.mcworldsBackup

Sie können es dann mit auflisten

launchctl list | grep com.nocturnal.mcworldsBackup

Die erste Spalte des Ergebnisses ist die PID des Prozesses, falls er gerade läuft. Die zweite Spalte ist der Exit-Code, der bei der letzten Ausführung zurückgegeben wurde. Verwenden Sie dies, um zu überprüfen, ob es ordnungsgemäß gelaufen ist. Wenn nicht, wird die Fehlermeldung in geschrieben /var/log/system.log.