2 votos

launchd startInterval más corto que el tiempo que tarda el script en completarse

Estoy usando launchctl para cargar/iniciar mi script de Python y funciona hasta cierto punto. Se lanza cada 120s, pero algunas veces mi script tarda 500s en ejecutarse y mi teoría es que si tengo un proceso en marcha lo reinicia en lugar de dejar que se ejecute el primero.

Lo que creo que sucede - lanzar tester.py (tiempo estimado de tester.py para completar 400s) - después de 120s - lanzar de nuevo tester.py y abandonar el primero

Lo que quiero: Terminar el primer tester.py y no reiniciarlo.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>BuildNotification.py</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/python</string>
        <string>/Users/xcuer/tester.py</string>
    </array>
    <key>StartInterval</key>
    <integer>120</integer>
    <key>TimeOut</key>
    <integer>7200</integer>
    <key>ExitTimeOut</key>
    <integer>7200</integer>
</dict>
</plist>

1voto

Steve Evans Puntos 155

launchd se centra en el lanzamiento de trabajos y en el mantenimiento de los mismos, por lo que no dispone de un mecanismo para gestionar el solapamiento de trabajos.

Archivo de bloqueo

Tradicionalmente, en un entorno UNIX, se utiliza un archivo de bloqueo para impedir que los procesos se ejecuten varias veces.

Los pasos fundamentales son:

  1. En el lanzamiento de script, si el archivo de bloqueo ya existe, detenga el script.
  2. En el lanzamiento de script, si el archivo de bloqueo no existe, crea el archivo de bloqueo.
  3. Al finalizar script, elimina el archivo de bloqueo.

En MacOS, cree su archivo de bloqueo en /var/tmp para los procesos de la informática.

Ejemplo de aplicación

if ! mkdir /var/tmp/myscript.lock 2>/dev/null; then
    echo "Myscript is already running." >&2
    exit 1
fi

Ver Manera rápida y sucia de asegurar que sólo una instancia de un shell script se está ejecutando a la vez y ¿Cuál es la mejor manera de asegurar que sólo se ejecute una instancia de un script de Bash? para muestras de scripts.

Posibles problemas

Hay casos límite.

launchd quiere que los puestos de trabajo se presenten a menos n segundos antes de terminar . Cuando el scriptencuentra un archivo de bloqueo existente, considera la suspensión para n segundos y luego salir.

¿Qué sucede si tu script es eliminado o sale por un error? ¿Puede estar seguro de que el archivo de bloqueo se elimina?

En C, un truco para asegurar la eliminación de un archivo es crear, abrir y eliminar el archivo - un archivo eliminado mantenido abierto en UNIX permanecerá hasta que el proceso de apertura salga. El archivo se elimina incluso si el proceso se bloquea.

En un shell script, capta la señal de finalización y se asegura de eliminar el archivo.

Otro problema potencial es la comprobación de la existencia del archivo. Esta comprobación podría ocurrir facciones de segundo antes de que el anterior script termine. Esto será raro pero posible. El enfoque citado anteriormente pretende superar esto.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X