Cómo registrar un agente con launchd

Cómo registrar un agente con launchd

No puedo programar un inicio periódico con launchctl/ launchden OS X (Leopard). Básicamente, no puedo encontrar una lista de instrucciones paso a paso en la web y el enfoque intuitivo no funciona.

El sync.plistarchivo:

<?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>net.madrat.utils.sync</string>
        <key>Program</key>
        <string>rsync</string>
        <key>ProgramArguments</key>
        <array>
            <string>-ar</string>
            <string>/path/to/folder/</string>
            <string>/path/to/backup/</string>
        </array>
        <key>StartInterval</key>
        <integer>7200</integer>
    </dict>
</plist>

Puse este script dentro de la ruta ~/Library/LaunchAgents.

A continuación, heregistradoel guión usando

launchctl load ~/Library/LaunchAgents/sync.plist

Finalmente, para probar que funciona,comenzóel trabajo:

 launchctl start net.madrat.utils.sync

- No pasó nada. La ejecución manual del rsynccomando en la terminal produce el resultado esperado.

Estoy bastante seguro de que el trabajo se registró correctamente porque si intento iniciar un trabajo que no existe, aparece un mensaje de error (quenoingrese el comando anterior).

¿Qué hice mal?

Respuesta1

lingónes una buena herramienta GUI para gestionar launchd. El proyecto parece no ser compatible ahora... pero definitivamente todavía funciona en 10.5.x.

Pero para tu problema específico... ¿has probado?

sudo launchctl list 

Esto le indicará si el .plist se está activando correctamente. Devolverá 1 si el demonio no se inicia y un '0' si tiene éxito. Quizás busque eso.

Siempre que veo un '1' generalmente es porque puse el script en el lugar equivocado, cometí un error tipográfico o configuré los permisos incorrectamente.

Además... reinicie con frecuencia... He visto

launchctl start

no será efectivo donde se realizó un reinicio.

Además, al analizar su pregunta más de cerca... ¿por qué no simplemente poner ese código rsync en un script bash... y pegarlo /usr/bin/... Entonces podría simplemente chmod+xese archivo... y simplificar su .plist? para disparar ese script cuando quieras....

Respuesta2

Respuesta larga:

Es difícil trabajar con launchd sin comprender algunos principios básicos. Por lo tanto, es probable que no encuentre ninguna instrucción paso a paso, ya que tiene tantas capacidades. Una buena idea es consultar la guía de introducción al ADC:http://developer.apple.com/macosx/launchd.html

También puede leer las páginas de manual de launchdy launchctlla sintaxis de los archivos .plist launchd.plist.

Hay un malentendido frecuente sobre dónde colocar a tu agente o demonio, así que déjame darte información al respecto aquí:

  • Si su trabajo necesita ejecutarse incluso cuando no hay usuarios conectados, colóquelo en /Library/LaunchDaemons.
  • Si solo es útil cuando los usuarios han iniciado sesión, colóquelo en /Library/LaunchAgents o en los directorios personales de LaunchAgents de usuarios específicos (~/Library/LaunchAgents).
  • No coloque su trabajo en /System/Library, que está reservado para demonios proporcionados por el sistema.
~/Library/LaunchAgents         Per-user agents provided by the user.
/Library/LaunchAgents          Per-user agents provided by the administrator.
/Library/LaunchDaemons         System wide daemons provided by the administrator.
/System/Library/LaunchAgents   Mac OS X Per-user agents.
/System/Library/LaunchDaemons  Mac OS X System wide daemons.

Respuesta corta:

El nombre de su archivo plist puede ser incorrecto, no puedo probarlo ahora, pero lo habría configurado en net.madrat.utils.sync.plist. También puede ser útil primero unloadtu demonio antes de cargarlo si editaste el archivo.

Respuesta3

No puedo encontrar documentación que indique que este es en realidad un comportamiento estándar, pero parece que launchd requiere rutas absolutas en los archivos plist. Así que inténtalo /usr/bin/rsyncen su lugar. ¡Funciona para mi!

Respuesta4

intente agregar estas claves a su archivo plist

    <key>KeepAlive</key>
    <true/>
    <key>RunAtLoad</key>
    <true/>

información relacionada