Cómo registrar un agente con launchd

14

No puedo programar un lanzamiento periódico con launchctl/ launchden OS X (Leopard). Básicamente, no puedo encontrar una lista paso a paso de instrucciones 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>

He puesto este script dentro del camino ~/Library/LaunchAgents.

A continuación, he registrado el script usando

launchctl load ~/Library/LaunchAgents/sync.plist

Finalmente, para probar que funciona, comencé el trabajo:

 launchctl start net.madrat.utils.sync

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

Estoy bastante seguro de que el trabajo se registró correctamente porque si intento iniciar un trabajo no existente, recibo un mensaje de error (que no recibí en el comando anterior).

¿Qué hice mal?

Konrad Rudolph
fuente

Respuestas:

5

Lingon es una buena herramienta GUI para administrar launchd. El proyecto parece no ser compatible ahora ... pero definitivamente todavía funciona en 10.5.x.

Pero para tu problema específico ... ¿has intentado

sudo launchctl list 

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

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

Además ... reiniciar a menudo ... he visto

launchctl start

no será efectivo donde se reinició ...

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

CaseyIT
fuente
Gracias, poner el comando en un archivo de shell adicional y ejecutar eso hizo el truco. Sin embargo, es una solución muy insatisfactoria ... ¿por qué no se invoca el comando directamente? Por cierto, launchctl list lo hizo de la pantalla 1, pero sólo después de que comenzara el agente manualmente utilizando launchctl start.
Konrad Rudolph
No soy positivo, pero creo que los archivos launchd .plist en realidad solo están destinados a definir criterios de 'lanzamiento bajo demanda' para demonios ... Quizás no estaba seguro de qué hacer con los argumentos que había pasado en <key> Argumentos del programa </key>.
CaseyIT
11

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, tiene muchas capacidades. Un buen movimiento es dirigirse a la guía de inicio en el ADC: http://developer.apple.com/macosx/launchd.html

También puede leer las páginas del manual para launchd, launchctly la sintaxis de los archivos .Plist, launchd.plist.

Hay un malentendido frecuente sobre dónde poner a su agente o demonio, así que permítame mostrarle información al respecto aquí:

  • Si su trabajo necesita ejecutarse incluso cuando no hay usuarios conectados, póngalo en / Library / LaunchDaemons.
  • Si solo es útil cuando los usuarios inician 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 estar equivocado, no se puede probar en este momento, pero lo habría configurado net.madrat.utils.sync.plist. También puede ser útil primero unloadsu demonio antes de cargarlo si editó el archivo.

Arko
fuente
Gracias por la info. Sin embargo: (1) Ya he leído todos los documentos que vinculó anteriormente, y varios más. En ninguna parte dice realmente cómo lanzar un agente. (Al menos, no lo encontré en ningún lado). Eso estaría bien si mi enfoque intuitivo funcionara. (2) Cambiar el nombre del archivo tampoco funciona. :-( (3) parte de la información está desactualizada. Por ejemplo, sugieren el comando launchd bashpara la depuración, pero esto no funciona en Leopard ( launchdno se puede iniciar directamente).
Konrad Rudolph
@Konrad Rudolph: De nada: :) @Skylarking obtiene algunos puntos interesantes: ¿verificaste la premisión del archivo? ¿O usó el comando sudo? También tuve que reiniciar a veces para que launchctl funcionara correctamente.
Arko
3

No puedo encontrar documentación de que este sea realmente un comportamiento estándar, pero parece que launchd requiere rutas absolutas en los archivos plist. Intenta en su /usr/bin/rsynclugar. ¡Funciona para mi!

Erik Schoster
fuente
0

prueba esto, mis scripts funcionan sin usar la parte del programa, solo argumentos del programa ...

reemplazar

    <key>Program</key>
    <string>rsync</string>
    <key>ProgramArguments</key>
    <array>
        <string>-ar</string>
        <string>/path/to/folder/</string>
        <string>/path/to/backup/</string>
    </array>

con

    <key>OnDemand</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>rsync</string>
        <string>-ar</string>
        <string>/path/to/folder/</string>
        <string>/path/to/backup/</string>
    </array>
Becky
fuente
0

intente agregar estas claves a su archivo plist

    <key>KeepAlive</key>
    <true/>
    <key>RunAtLoad</key>
    <true/>
ágil
fuente
0

Tiene una cosa incorrecta en su archivo .plist y una cosa dudosa (cada uno de estos puntos ha sido mencionado en respuestas anteriores; los estoy reuniendo aquí).

Sería mejor escribir:

<key>ProgramArguments</key>
<array>
  <string>/usr/local/bin/rsync</string>
  <string>-ar</string>
  <string>/path/to/folder/</string>
  <string>/path/to/backup/</string>
</array>

El primer argumento en la ProgramArgumentsmatriz es el programa que se ejecutará; lo ha omitido. Si Programse omite la clave, el valor predeterminado es el primer argumento de ProgramArguments; Probablemente sea aconsejable especificar esto solo una vez.

Debido a que omitió este primer argumento, su .plist habrá invocado rsync (al ser nombrado Program), pero el 'primer argumento' de rsync habría sido /path/to/folder, y no -ar(el programa en ejecución habrá sido muy brevemente visible en la pssalida, antes de salir con un error, pero llamado como -ar, que es el contenido del argumento cero).

No tiene que incluir el camino rsync, pero en este tipo de contexto, probablemente sea prudente hacerlo, para evitar tener que confiar en que PATHse establezca adecuadamente.

La documentación para esto está en launchd.plist(5). Tenga en cuenta que esa página de manual destaca que el valor de la ProgramArgumentsclave se pasa a execvp(3). Es la página de execvpmanual que explica sobre la búsqueda de RUTA.

Gris normando
fuente