Launchctl sagt, dass plist ungültig ist, plutil sagt, dass es in Ordnung ist

Ich versuche, launchd ein Shell-Skript ausführen zu lassen, wenn ich einem neuen WiFi-Netzwerk beitrete. Ich habe diese Plist-Datei (nahe an dieser SuperUser-Antwort ) unter /Users/myname/Library/LaunchAgents/my.networkChangeListener.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">
<dict>
  <key>Label</key>
  <string>my.networkChangeListener</string>
  <key>LowPriorityIO</key>
  <true/>
  <key>ProgramArguments</key>
  <array>
<string>/Users/myname/bin/networkChangeListener/onNetworkChange.sh</string>
  </array>
  <key>WatchPaths</key>
  <array>
    <string>/etc/resolv.conf</string>
    <string>/Library/Preferences/SystemConfiguration/NetworkInterfaces.plist</string>
    <string>/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist</string>
  </array>
  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

Mein Benutzer ist der Besitzer der Plist und die Gruppe ist "Staff".

Wenn ich versuche, die Datei durch Ausführen von zu laden launchctl load ~/Library/LaunchAgents/my.networkChangeListener.plist, erhalte ich die Fehlermeldung „Ungültige Eigenschaftsliste“.

Wenn ich jedoch starte plutil ~/Library/LaunchAgents/my.networkChangeListener.plist, gibt es "OK" zurück.

Was ist das Problem mit meiner plist-Datei? Ist etwas spezifisch für launchd? Ich bin völlig in einer Sackgasse, wie ich das debuggen soll.

Antworten (2)

Die ersten paar Zeilen sollten sein

<?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>

In Ihrer Datei (sowie in der verknüpften Antwort) fehlt das <plist version="1.0">Teil.

Danke schön! Das hat das Problem gelöst. Es sieht so aus, als ob etwas plutilhätte auffallen müssen … aber andererseits scheint es auch etwas zu sein, das ich in den Unmengen von Malen hätte auffangen sollen, wenn ich den Code auf der Suche nach nicht übereinstimmenden Tags überlesen habe.
Nur als Hinweis: OS X kommt mit xmllint, das Teil der OpenSource libxml ist. Wenn Sie nur XML validieren möchten, können Sie Folgendes versuchen: endor-3:~ garex$ xmllint /tmp/my.networkChangeListener.plist /tmp/my.networkChangeListener.plist:21: parser error : Extra content at the end of the document </plist> ^Das zeigte, dass Ihr Plist-Tag geschlossen, aber nicht geöffnet wurde ...

Eine völlig leere Liste sieht so aus:

<?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/>
</plist>

Ich verwende PlistEdit Pro, wenn ich viele Änderungen vornehmen muss, da es leicht ist, Fehler zu machen.