¿Alguien puede recomendar un buen tutorial para escribir (desde cero) un trabajo launchd de estilo cron?

17

Tengo un trabajo bastante simple que me gustaría realizar cada hora. Podría hacerlo usando cron , pero pensé que usaría esto para aprender sobre launchd , ya que escucho cosas buenas sobre él. Tengo la página man launchd.plist como referencia, pero estoy buscando algo basado más en la creación de un trabajo de ejemplo.

    
pregunta Hank Gay 29.08.2010 - 15:24

4 respuestas

13

launchd ejecuta Daemons ( /Library/LaunchDaemons o /System/Library/LaunchDaemons ) como root, y los ejecutará independientemente de si los usuarios han iniciado sesión o no. Los Agentes de lanzamiento ( /Library/LaunchAgents/ o ~/Library/LaunchAgents/ ) se ejecutan cuando un usuario inicia sesión como ese usuario. No puede utilizar setuid para cambiar el usuario que ejecuta el script en los daemons. El directorio /System está reservado para las tareas de Mac OS X, por lo que recomiendo poner su launchd en la carpeta /Library o ~/Library , ya que tiene sentido.

Entonces, el primer paso es determinar si estás creando un agente o un demonio.

El segundo paso es hacer tu archivo .plist . Puede usar programas basados en GUI como Lingon para ayudar con esto o simplemente usar su editor de texto favorito:

Una muestra .plist para ejecutar un script cada hora ( StartInterval o StartIntervalCalendar son las claves que queremos - StartInterval para que ocurra un elemento cada x segundos, StartIntervalCalendar durante un tiempo específico y / o fecha. Consulte 126907 en SuperUser para un ejemplo que hice con StartCalendarInterval):

<?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>local.IDENTIFIER_HERE.SOMETHING</string>
    <key>OnDemand</key>
    <true/>
    <key>RunAtLoad</key>
    <false/>
    <key>UserName</key>
    <string>USERNAME HERE</string>
    <key>Program</key>
    <string>/PATH/TO/SCRIPT</string>
    <key>ProgramArguments</key>
    <array>
        <string>Argument_1</string>
        <string>Argument_2</string>
    </array>
    <key>StartInterval</key>
    <integer>3600</integer>
</dict>
</plist>

Modifique el .plist según sea necesario para señalar su secuencia de comandos y los argumentos que sean necesarios (los argumentos están en líneas separadas) y guarde el archivo con el mismo nombre que el valor de Etiqueta pero con .plist al final. (por ejemplo, local.my-mac.flickrstats se guardaría como local.my-mac.flickrstats.plist ). Si aún no lo has hecho, mueve ese archivo .plist a /Library/LaunchDaemons al crear un Daemon (se ejecuta todo el tiempo) o a ~/Library/LaunchAgents (solo estás registrado) o /Library/LaunchAgents (cualquier usuario ha iniciado sesión ).

Para iniciar el trabajo, desea ejecutar launchctl según sea necesario para cargar el archivo. Para los elementos en /Library , debe usar sudo: por ejemplo, sudo launchctl load -w /PATH/TO/PLIST

Para referencia, también consulte las siguientes preguntas sobre el Superusuario: Launchd command as root , Cargar un daemon de todo el sistema , y ¿Cómo puedo hacer que se ejecute un script todos los días

    
respondido por el Chealion 29.08.2010 - 16:07
4

Sé que no es un tutorial bueno , pero puede echar un vistazo al Guía de programación de servicios y demonios de Apple, que tiene una sección sobre Programación de trabajos programados.

Sé que no es un tutorial completo, pero con él, puedes entender los conceptos básicos de launchd .

También proporciona un ejemplo de una tarea crond :

<?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.apple.periodic-daily</string>
    <key>ProgramArguments</key>
    <array> 
        <string>/usr/sbin/periodic</string>
        <string>daily</string>
    </array>
    <key>LowPriorityIO</key>
    <true/>
    <key>Nice</key>
    <integer>1</integer>
    <key>StartCalendarInterval</key>
    <dict>  
        <key>Hour</key>
        <integer>3</integer>
        <key>Minute</key>
        <integer>15</integer>
    </dict>
</dict>
</plist>
    
respondido por el Studer 29.08.2010 - 15:33
4

Esto me ha ayudado mucho: enlace

Cubre la configuración, la administración y la resolución de problemas utilizando Terminal o la GUI de lanzamiento LaunchControl . También se proporcionan ejemplos.

    
respondido por el khowl 30.10.2013 - 09:11
2

Sé que buscabas un tutorial, pero por casualidad alguien viene aquí como parte de buscar una herramienta que los ayude a crear / editar entradas de launchd, he usado esto antes: Lingon (sourceforge)

Ya no se está desarrollando activamente, pero lo que sí funciona (y obviamente incluye la fuente, etc.). Lo he usado en Snow Leopard para programar copias de seguridad en la nube de Amazon, etc.

    
respondido por el robsoft 30.08.2010 - 12:26

Lea otras preguntas en las etiquetas