¿Cómo asocio un plist de launchd 2 con sus objetivos de dominio y servicio?

¿Qué son exactamente estos "dominios" y "objetivos de servicio" y cómo los asocio con plists para que los use launchd?

OS X 10.10 presenta una nueva launchctlAPI para administrar LaunchDaemons y lanzar plists. Los mensajes de registro y las páginas del manual sugieren que las teclas like KeepAlivey RunAtLoadya no deben usarse y que los subcomandos enable; bootstrap; y kickstartdebe usarse con preferencia a load -wyunload -w

Sin embargo, no está claro en las páginas del manual cómo asociar una plist con el "dominio" y el "objetivo del servicio" de los que habla y sin los cuales estos comandos no se pueden usar con las plist existentes que aparentemente eran suficientes para OS X 10.9

Por ejemplo [actualizado]: Un plist básico que estamos tratando de "lanzar"; aparentemente arrancado en el dominio del "sistema" pero posteriormente no reconocido en el "sistema"

# pwd
/Library/LaunchDaemons
# cat com.iainhouston.django.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 >
<plist version="1.0">
<dict>
     <key>Label</key>
     <string>com.iainhouston.django</string>
     <key>ProgramArguments</key>
     <array>
          <string>/usr/local/virtualenvs/django.iainhouston.com/bin/gunicorn</string>
          <string>--bind=127.0.0.1:49202</string>
          <string>--workers=2</string>
          <string>superlists.wsgi:application</string>
     </array>
     <key>Disabled</key><false/>
</dict>
</plist> 
# launchctl bootstrap system com.iainhouston.django.plist
/Library/LaunchDaemons/com.iainhouston.django.plist: Service is disabled 
# launchctl enable system/com.iainhouston.django.plist 
# launchctl kickstart system/com.iainhouston.django.plist
Could not find service "com.iainhouston.django.plist" in domain for system  

Motivación

Los registros de registro del sistema que launchctl -w load ...se quejan cuando usamos KeepAlivecon RunAtLoadese Este servicio está definido para estar en ejecución constante y es intrínsecamente ineficiente. por lo que estamos motivados para usar la nueva interfaz.
No solo eso, tenemos problemas significativos con el uso excesivo del procesador que queremos controlar al proporcionar las palabras clave adecuadas a pedido, por lo que, nuevamente, estamos motivados para comprender cómo interactuar con el nuevo launchd ... no es fácil con los documentos tal como están!

Respuestas (2)

Si puede, informe un error a Apple con respecto a la documentación incompleta o poco clara.

launchdparece haber sido reescrito para OS X 10.10 y es probable que aún esté cambiando para algunas versiones menores.

Los objetivos de dominios y servicios parecen ser una abstracción de las diversas carpetas disponibles para los tickets de trabajo de lanzamiento. También permiten un medio para que los comandos launchctl se dirijan a sesiones específicas; una función que debería permitir que un comando launchctl afecte a otras sesiones de usuario.

Sin embargo, a partir de OS X 10.10.1, la página del manual no menciona las claves launchd.plistobsoletas KeepAliveo .RunAtLoad

Apple sugiere evitar KeepAlivey RunAtLoadporque la intención es evitar que se inicie un proceso sin una garantía de trabajo por realizar. Ambas claves permanecen y son necesarias para muchas tareas.

El mejor documento de referencia sigue siendo la Nota técnica TN2083, Daemons and Agents . Este documento proporciona una gran perspectiva sobre el lanzamiento y las intenciones de Apple sobre cómo deben implementarse los procesos en segundo plano.

Sí, presentaré un informe de error. Por supuesto, recurrí a TN2083 antes de publicar esta pregunta, pero está tan desactualizada: ¡se actualizó por última vez en noviembre de 2007! Las páginas de manual de la web para desarrolladores están en 10.9 y le indican las páginas de manual de su sistema Yosemite. Allí verá la discusión sobre las claves KeepAlive y RunAtLoad. No es que estén en desuso, pero en el caso de RunAtLoad: "Esta clave debe evitarse, ya que los inicios de trabajos especulativos tienen un efecto adverso en los escenarios de inicio del sistema e inicio de sesión del usuario". Sin embargo, no hay ejemplos de tipos de trabajo ni sugerencias de uso. Muy insatisfactorio.
Error 1915644 creado.
Afortunadamente RunAtLoady KeepAlivepermanecen, pero simplemente se les desaconseja. Algunas tareas requieren estos comportamientos, pero siempre que sea posible, Apple claramente quiere que los ingenieros reconsideren el enfoque predeterminado. Un empujón en lugar de un absoluto. Gracias por archivar y señalar el error.
¡No siento que solo estoy ejercitando mi TOC! De acuerdo, la página de manual avanza, pero el registro ahora se queja si usamos KeepAlivecon RunAtLoadeso "Este servicio está definido para estar en ejecución constante y es intrínsecamente ineficiente". por lo que estamos motivados para usar la nueva interfaz. No solo eso, tenemos problemas con el uso excesivo del procesador que queremos controlar al proporcionar las palabras clave adecuadas a pedido, por lo que, nuevamente, estamos motivados para comprender cómo interactuar con el nuevo launchd ... no es fácil con los documentos como ellos permanecen.

Está cerca, pero no debería tener la parte .plist en los comandos enable y kickstart. Aquí hay un código que usamos para asociarlo a un objetivo de dominio y servicio para un usuario. $UID es básicamente su ID de usuario.

launchctl bootstrap gui/$UID /Library/LaunchAgents/com.yourcompany.yourapp.plist
launchctl enable gui/$UID/com.yourcompany.yourapp
launchctl kickstart -k gui/$UID/com.yourcompany.yourapp
Un paso más allá, pero... ¿qué haces para "descargar" el demonio iniciado? unbootstrapaun no implementado; stopy disableparecen no tener efecto y killno reconoce ni SIGTERMni SIGKILL....
Simplemente haría una parada (que debería finalizar el proceso) y eliminaría el archivo plist, ¿verdad?
Debería, pero no (ver mi comentario anterior). Compruébelo y vea lo que obtiene. Claramente, la nueva API aún no está completamente implementada y debe evitarse.