Warum reagiert meine „launchd“-Aufgabe nicht auf Änderungen in überwachten Dateien?

Ich habe eine launchdAufgabe, die nicht ausgelöst wird, wenn sich eine Datei ändert, und kann nicht herausfinden, warum sie fehlschlägt.

Wenn ich das .plistunten mit lade

launchctl load /Users/Rax/Library/LaunchAgents/com.crashplan.status.plist

Das angegebene Skript wird (einmal) ausgeführt und läuft wie erwartet (ich kann es auch direkt von der Befehlszeile aus erfolgreich ausführen). Aber wenn sich die Datei im Überwachungspfad ( /Library/Logs/CrashPlan/history.log.0) ändert, passiert nichts.

Was könnte fehlen, was verhindert, dass dieser Task auf die Dateiänderung reagiert?


<?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.crashplan.status</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/Rax/Library/Automation/Shell/crashplan_status</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>/Library/Logs/CrashPlan/history.log.0</string>
    </array>
</dict>
</plist>

Antworten (2)

FWIW Ich habe es hier ausprobiert und es scheint bei mir zu funktionieren. Jedes Mal, wenn ich manuell etwas an /Library/Logs/CrashPlan/history.log.0 angehängt habe, wurde das Skript ausgelöst.

Als solches ist dies nicht wirklich eine Antwort, sondern eher eine Reihe von Tipps zum Debuggen launchd:

Ein paar Tipps zur Diagnose von launchd:

1) Verwenden Sie die Pfade stdoutund stderrund prüfen Sie, ob etwas bei ihnen protokolliert wird. Sie können dies tun, indem Sie diese Zeilen zu Ihrer com.crashplan.status.plistDatei hinzufügen.

<key>StandardErrorPath</key>
<string>/tmp/com.crashplan.status.stderr.log</string>
<key>StandardOutPath</key>
<string>/tmp/com.crashplan.status.stdout.log</string>

(Wenn mehrere Personen denselben Mac verwenden, möchten Sie vielleicht einen anderen Pfad als /tmp/ verwenden, aber wenn es nur Sie sind, dann ist es so gut wie jeder andere.)

2) Mit #1 möchten Sie möglicherweise auch Ihr Skript (/Users/Rax/Library/Automation/Shell/crashplan_status) anpassen, um Debugging-Informationen einzuschließen, z. B. wann es gestartet und wann es beendet wurde. Das kann so einfach sein wie so etwas, das am Anfang des Skripts hinzugefügt wird:

echo "$0: started at `date`"

und so etwas gegen Ende

echo "$0: finished at `date`"

3) Bei #2 möchten Sie vielleicht auch so etwas wie Terminal-Notifier verwenden, um anzuzeigen, wann Ihr Skript aufgerufen wird, zumindest bis Sie die Debugging-Phase hinter sich haben.

4) Wenn nichts davon hilft, sollten Sie den Exit-Status aller Befehle überprüfen, die Sie aufrufen, crashplan_statusund sehen, ob diese ordnungsgemäß beendet werden. Nehmen wir zum Beispiel an, dass Sie echoin Ihrem gelaufen sindcrashplan_status

5) Unterscheidet sich Ihre Umgebung launchdin irgendeiner Weise von Ihrer Shell? Dies lässt sich am besten überprüfen, indem Sie diese Zeile am Anfang Ihres launchd-Skripts hinzufügen:

/usr/bin/printenv | /usr/bin/open -ef

wodurch die printenvan die Standardausgabe gesendet und die Ergebnisse in TextEdit geöffnet werden.

Das häufigste „Umgebungsproblem“, auf das ich stoße, ist, dass $PATH für launchd nicht richtig eingestellt ist. Es wird normalerweise in Ihren Shell-Init-Dateien wie .bashrc festgelegt und von allen Shell-Skripten geerbt, die Sie von Terminal aus ausführen, aber nicht für launchd.

Sie können den Pfad sehen, der launchdverwendet wird, indem Sie:

launchctl getenv PATH

Wenn Sie es einstellen möchten, können Sie es einstellen

launchctl setenv PATH

Zum Beispiel wäre es für mein System:

launchctl setenv /Users/luomat/Dropbox/bin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin

Wenn Sie nicht bei jedem Start Ihres Computers daran denken müssen, dies einzustellen, können Sie es hinzufügen, /etc/launchd.confindem Sie eine Zeile hinzufügen:

setenv PATH /Users/luomat/Dropbox/bin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin

ändern Sie das natürlich, damit es zu Ihrem System passt. Seien Sie auch nicht überrascht, wenn /etc/launchd.confes auf Ihrem System nicht vorhanden ist. Möglicherweise müssen Sie es erstellen. Dazu empfehle ich ein einfaches:

sudo pico -w /etc/launchd.conf

und wenn Sie mit der Bearbeitung fertig sind, drücken Sie control+ Xund folgen Sie den Anweisungen, um die Änderungen zu speichern.

Ich weiß, dass dies ein alter Beitrag ist, aber da er keine wirkliche Antwort enthält, werde ich nur einen Vorschlag posten. Besteht das Problem immer noch oder wurde es endgültig gelöst? Wenn nicht, habe ich vielleicht eine Ahnung, da ich das gleiche Problem ausprobiert habe.

Überprüfen Sie im Terminal, ob Ihre überwachte Datei erweiterte Argumente hat, indem Sie diesen Befehl verwenden:

ls -l@

Wenn Ihre Datei erweiterte Argumente wie diese hat:

com.apple.quarantine    32

Versuchen Sie, diesen Befehl einzugeben, um erweiterte Argumente zu entfernen (verwenden Sie bei Bedarf sudo):

xattr -d -r com.apple.quarantine /Library/Logs/CrashPlan/history.log.0

in Ihrem Fall…

Sieht so aus, als würden launchd-Überwachungspfade Dateien ignorieren, die ein erweitertes Quarantäneargument haben…

Hoffe es kann helfen.