7 votos

Launchctl dice que plist no es válido, plutil dice que está bien

Estoy intentando que launchd ejecute un shell script cuando me una a una nueva red WiFi. He creado este archivo plist (estrechamente basado en esta respuesta de SuperUser ) en /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>

Mi usuario es el propietario del plist, y el grupo es "staff".

Cuando intento cargar el archivo ejecutando launchctl load ~/Library/LaunchAgents/my.networkChangeListener.plist Me aparece un error que dice "Lista de propiedades no válida".

Sin embargo, cuando ejecuto plutil ~/Library/LaunchAgents/my.networkChangeListener.plist , devuelve "OK"

¿Cuál es el problema con mi archivo plist? ¿Es algo específico de launchd? Estoy completamente en un callejón sin salida de cómo depurar esto.

10voto

Las primeras líneas deben ser

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

A tu archivo (así como al de la respuesta enlazada) le falta el <plist version="1.0"> parte.

1 votos

Gracias. Eso resolvió el problema. Parece que algo plutil debería haber detectado pero también parece algo que debería haber detectado en las montones de veces que leí el código en busca de etiquetas que no coincidían.

2 votos

Sólo como una pista: OS X viene con xmllint, que es parte de la libxml OpenSource. Si sólo quieres validar xml, podrías probar esto: endor-3:~ garex$ xmllint /tmp/my.networkChangeListener.plist /tmp/my.networkChangeListener.plist:21: parser error : Extra content at the end of the document </plist> ^ Eso mostró que su etiqueta plist estaba cerrada pero no abierta...

0voto

Velociraptors Puntos 1509

Un plist totalmente vacío tiene este aspecto:

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

Yo uso PlistEdit Pro cuando tengo que hacer muchos cambios, ya que es fácil cometer errores.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X