7 votos

Cómo puedo detener un launchd secuencia de comandos se ejecute en wake

Tengo una simple launchd script que reproduce un sonido cada 30 minutos y se sale de la biblioteca de usuario ~/Library . No se ejecuta si mi máquina está dormida, pero no ejecutar el último evento que se perdió cuando la máquina despierta. Creo que este es el comportamiento esperado. Mi pregunta es, ¿cómo puedo impedir que esto ocurra. Si me he perdido la mitad de horas de evento, no quiero que se ejecute en 20 minutos después de la hora.

Aquí está el núcleo de mi script. Llama a un script de Python. Traté de poner un bloque en la secuencia de comandos de python para comprobar que estoy dentro de un par de minutos de cada 30 minutos, pero que no parece funcionar en la vigilia. (Que está perdiendo 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í es un fragmento de código python que comprueba el tiempo 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)

11voto

Douglas Puntos 10417

El problema radica en launchd y cómo maneja los empleos que se pierden durante el sueño:

De la launchd.plist página man (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 un par de opciones a tener en cuenta...

  • volver a cron. Aunque obsoleta, cron no ejecutar los trabajos que se han perdido

  • comprobar el tiempo del día antes de la reproducción del sonido (esto se puede hacer con un "contenedor" de secuencia de comandos o dentro del mismo script.

  • escribir una entrada de registro (en algún lugar). En el script de lanzamiento, analizar el registro. Si un sonido se reproduce dentro de los últimos 30 minutos, no jugar de nuevo.

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