launchd startInterval más corto que el tiempo necesario para que se complete el script

2

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

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

Lo que quiero: Para terminar el primer tester.py 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>
    
pregunta donttellunclesam 06.04.2018 - 03:47

1 respuesta

0

launchd se enfoca en lanzar trabajos y mantener los trabajos en ejecución, no tiene un mecanismo para manejar trabajos superpuestos.

Bloquear archivo

Tradicionalmente, en un entorno UNIX, un archivo de bloqueo se usa para detener la ejecución de procesos varias veces.

Los pasos principales son:

  1. En el inicio del script, si el archivo de bloqueo ya existe, detenga el script.
  2. En el inicio del script, si el archivo de bloqueo no existe, cree el archivo de bloqueo.
  3. Al finalizar el script, elimine el archivo de bloqueo.

En macOS, cree su archivo de bloqueo en /var/tmp para procesos de todo el equipo.

Implementación de muestra

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

Consulte Una forma rápida y sucia de garantizar que solo se ejecute una instancia de un script de shell a la vez y ¿Cuál es la mejor manera de garantizar que solo se ejecute una instancia de un script Bash? para scripts de muestra.

Problemas potenciales

Hay casos de borde.

launchd quiere que se ejecuten trabajos en menos n segundos antes de terminar . Cuando la secuencia de comandos encuentre un archivo de bloqueo existente, considere dormir por n segundos y luego salir.

¿Qué sucede si su secuencia de comandos se cancela o se cierra debido a un error? ¿Puede estar seguro de que se eliminó el archivo de bloqueo?

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

En un script de shell, capture la señal de terminación y asegúrese de eliminar el archivo.

Otro problema potencial es verificar el archivo existente. Esta comprobación podría suceder en facciones de segundo antes de que finalice el script anterior. Esto será raro pero posible. El enfoque citado anteriormente pretende superar esto.

    
respondido por el Graham Miln 06.04.2018 - 09:11

Lea otras preguntas en las etiquetas