Quiero automatizar la ejecución de un trabajo de larga duración. Debe lanzarse una vez al día, pero sólo si el trabajo anterior no está todavía en ejecución. ¿Puedo lograr esto con launchd y cómo?
Respuesta
¿Demasiados anuncios?Sí, launchd
asegura que sólo tiene una instancia del "agente" en ejecución y lo hace por usted automáticamente. Configure su trabajo de forma normal utilizando StartInterval para programar la ejecución de su trabajo en segundo plano y el sistema no lanzará una nueva instancia si la instancia anterior no se ha completado al llegar a ese intervalo de inicio programado.
Si pasan varios intervalos de programación, launchd
ejecutará sólo una nueva instancia en el siguiente intervalo. Es "inteligente" al respecto.
Aquí hay un ejemplo de 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.mycompany.test</string>
<key>ProgramArguments</key>
<array>
<string>/some/path/to/a/script.sh</string>
</array>
<key>StartInterval</key>
<integer>60</integer>
</dict>
</plist>
En el ejemplo anterior, si /some/path/to/a/script.sh
tarda 361 segundos en ejecutarse, launchd
no iniciará 5 nuevas instancias durante ese lapso de tiempo, y sólo iniciará una nueva instancia en la marca de 420's segundos en el tiempo.
El texto de la página man de launchd.plist(5) lo dice, pero la forma en que está escrito no lo hace evidente:
StartInterval
Esta tecla opcional hace que el trabajo se inicie cada N segundos. Si el sistema está dormido, el trabajo se iniciará la siguiente vez que el ordenador se despierte. Si transcurren varios intervalos antes de que el ordenador se despierte, esos eventos se unirán en un evento evento al despertar del sueño.
Esa última frase dice esencialmente " launchd
hace que tus trabajos sean singleton para ti siempre y cuando seguir las normas de buen comportamiento en el trabajo ".