Come interrompere l'esecuzione di uno script launchd al risveglio

3

Ho un semplice script launchd che riproduce un suono ogni 30 minuti e che esce dalla libreria utente ~/Library . Non funziona se la mia macchina è addormentata, ma esegue l'ultimo evento mancato quando la macchina si sveglia. Penso che questo sia il comportamento previsto. La mia domanda è, come faccio a impedire che ciò accada. Se ho saltato l'evento di mezz'ora, non voglio che venga eseguito alle 20 minuti dopo l'ora.

Ecco il nocciolo del mio script. Chiama uno script Python. Ho provato a mettere un blocco nello script python per verificare che io sia in pochi minuti ogni 30 minuti, ma non sembra funzionare sulla scia. (Manca l'orologio di sistema in qualche modo?)

<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>

Ecco uno snippet dal codice Python che controlla il tempo prima di riprodurre il suono.

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

    
posta pheon 06.12.2018 - 15:15
fonte

1 risposta

5

Il problema si trova con launchd e in che modo gestisce i lavori persi durante il sonno:

Dalla pagina man di 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.

Quindi, ci sono alcune opzioni da considerare ...

  • ripristina cron . Sebbene deprecato, cron non eseguirà i lavori che sono stati persi

  • controlla l'ora del giorno prima di riprodurre il suono (questo può essere fatto con uno script "wrapper" o all'interno dello script stesso.

  • scrivi una voce di log (da qualche parte). All'avvio dello script, analizzare il registro. Se è stato riprodotto un suono negli ultimi 30 minuti, non riprodurlo.

risposta data 06.12.2018 - 18:17
fonte

Leggi altre domande sui tag