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

19

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

Hank Gay
fuente
Esto se debe mover a Stackoverflow.
Philip Regan el
55
@Philip Regan Lo pensé, pero no hay mucha programación involucrada, para mí. Si hubiera estado haciendo una cronpregunta, ¿no sería superuser.com el lugar correcto? Como launchdes la versión de Apple de cron(y también daemontools, y posiblemente otras cosas), pensé que esta era mi mejor opción.
Hank Gay el
También puede ponerlo en un script de
automatización
Con un poco de ironía, tres años más tarde necesito implementar un proceso cron / launchd yo mismo y me encontré mirando esta pregunta nuevamente bajo una luz completamente diferente. Stack Overflow tiene una opinión mixta sobre qué hacer con las preguntas lanzadas, pero realmente no les gustan estas preguntas. Solo pensé que toda la situación era divertida. +1
Philip Regan

Respuestas:

14

launchdejecuta Daemons ( /Library/LaunchDaemonso /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 usar setuid para cambiar el usuario que ejecuta el script en demonios. El /Systemdirectorio está reservado para las tareas de Mac OS X, por lo que recomiendo colocar sus launchdlistas en /Libraryla ~/Librarycarpeta o en la carpeta, según tenga sentido.

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

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

Una muestra .plistpara ejecutar un script cada hora ( StartIntervalo StartIntervalCalendarson las claves que queremos, StartIntervalpara que un elemento suceda cada xsegundo, StartIntervalCalendarpara una hora y / o fecha específica. Consulte 126907 en SuperUser para ver 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 .plistsegún sea necesario para apuntar a su secuencia de comandos y cualquier argumento según sea necesario (los argumentos están en líneas separadas) y guarde el archivo con el mismo nombre que el valor de la etiqueta pero .plistal final. (por ejemplo, se local.my-mac.flickrstatsguardaría como local.my-mac.flickrstats.plist). Si aún no lo ha hecho, mueva ese .plistarchivo a /Library/LaunchDaemonscuando crea un Daemon (se ejecuta todo el tiempo) o a ~/Library/LaunchAgents(solo usted está conectado) o /Library/LaunchAgents(cualquier usuario está conectado).

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

Como referencia, también consulte las siguientes preguntas sobre Superusuario : comando iniciado como root , carga un demonio en todo el sistema y cómo puedo hacer que se ejecute un script todos los días

Chealion
fuente
4

Sé que no es un buen tutorial, pero puedes echar un vistazo a la Guía de programación de servicios y demonios de Apple, que tiene una sección sobre la 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 crondtarea:

<?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>
Studer
fuente
Voté en contra porque admitiste que el recurso no es lo que pedí y me pareció un poco RTFM, pero lo he repensado y me gustaría rescindir mi voto a favor. Lamentablemente, no puedo a menos que la pregunta se edite (ha sido demasiado larga), y todavía no tengo suficiente representante para editar. ¿Podrías modificar algo? Gracias.
Hank Gay el
@Hank Gay: Gracias por tu comentario. Edité mi respuesta también.
Studer
4

Esto me ha ayudado mucho: http://launchd.info

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

khowl
fuente
2

Sé que estabas buscando un tutorial, pero por casualidad alguien viene aquí como parte de la búsqueda de una herramienta para ayudarlos a hacer / editar entradas lanzadas, he usado esto antes: Lingon (sourceforge)

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

Robsoft
fuente
Lingon ahora está en la tienda de aplicaciones, por lo que todavía está activo, pero no es gratuito. Consulte < peterborgapps.com/lingon >
user151019
La versión de la tienda de aplicaciones ha quedado paralizada por los requisitos de la política de Apple. La versión precompilada de SourceForge funciona bien, aunque el diálogo modal sobre guardar, que me dice que cierre sesión o reinicie para habilitar el demonio no se descartará. Tuve que salir del programa desde su menú (no forzar el cierre) y verificar para confirmar que había guardado el archivo correctamente. Paralizado en ese archivo y el activador de directorio no son compatibles, ni es posible crear algo que se ejecute como raíz con la versión de AppStore.
marfarma