Cómo detengo la ejecución de un script launchd en wake

3

Tengo un script de launchd simple que reproduce un sonido cada 30 minutos y se queda sin la biblioteca de usuario ~/Library . No se ejecuta si mi máquina está dormida, pero ejecuta el último evento perdido cuando la máquina se despierta. Creo que este es el comportamiento esperado. Mi pregunta es, ¿cómo puedo evitar que esto suceda? Si me perdí el evento de media hora, no quiero que se ejecute a los 20 minutos de la hora.

Aquí está el núcleo de mi script. Llama a un script de Python. Intenté poner un bloque en la secuencia de comandos de Python para comprobar que estoy dentro de unos minutos de cada 30 minutos, pero eso no parece funcionar al despertar. (¿Falta el reloj del sistema de alguna manera?)

<key>ProgramArguments</key>
<array>
    <string>/usr/local/bin/python3</string>
    <string>/Users/pheon/Documents/playsound.py</string>
</array>

<key>StartCalendarInterval</key>
<array>
    <dict>
        <key>Minute</key>
        <integer>0</integer>
    <dict>
        <key>Minute</key>
        <integer>30</integer>
    </dict>
</array>

Aquí hay un fragmento del código de Python que comprueba la hora antes de reproducir el sonido.

time0 = datetime.datetime.now() if (time0.minute % 30) < 2: subprocess.run(["/Users/pheon/bin/afplay-vol.sh", "1", bell],check=True)

    
pregunta pheon 06.12.2018 - 15:15

1 respuesta

4

El problema radica en launchd y en cómo maneja los trabajos que se pierden durante la suspensión:

Desde la página de manual launchd.plist ( man launchd.plist )

Unlike cron which skips job invocations when the computer is asleep,
launchd will start the job the next time the computer wakes up.  If
multiple intervals transpire before the computer is woken, those
events will be coalesced into one event upon wake from sleep.

Por lo tanto, hay algunas opciones a considerar ...

  • revertir a cron . Aunque está en desuso, cron no ejecutará trabajos que se hayan perdido

  • comprueba la hora del día antes de reproducir el sonido (esto puede hacerse con un script "wrapper" o dentro del propio script.

  • escribe una entrada de registro (en algún lugar). En el inicio del script, analice el registro. Si se escuchó un sonido en los últimos 30 minutos, no lo reproduzca de nuevo.

respondido por el Allan 06.12.2018 - 18:17

Lea otras preguntas en las etiquetas