launchd startInterval più breve del tempo impiegato per il completamento dello script

2

Sto usando launchctl per caricare / avviare il mio script python e funziona in una certa misura. Viene lanciato sempre 120, ma alcune volte il mio script impiega 500 secondi per essere eseguito e la mia teoria è che ho un processo in esecuzione che lo riavvia piuttosto che lasciare che il primo venga eseguito.

Quello che penso succede: - lancia tester.py (tester.py tempo stimato per completare 400s) - dopo i 120 anni - lancia nuovamente tester.py e abbandonare il primo

Cosa voglio: Per finire il primo tester.py non riavvialo.

<?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>
    
posta donttellunclesam 06.04.2018 - 03:47
fonte

1 risposta

1

launchd si concentra sull'avvio di lavori e sulla gestione dei lavori, non ha un meccanismo per gestire lavori sovrapposti.

Blocca file

Tradizionalmente in un ambiente UNIX, un file di blocco viene utilizzato per interrompere i processi da eseguire più volte.

I passaggi principali sono:

  1. All'avvio dello script, se il file di blocco esiste già, interrompi lo script.
  2. All'avvio dello script, se il file di blocco non esiste, crea il file di blocco.
  3. Al termine dello script, rimuovi il file di blocco.

Su macOS, crea il tuo file di blocco in /var/tmp per i processi a livello di computer.

Implementazione campione

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

Vedi Modo rapido e sporco per garantire che sia eseguita una sola istanza di uno script di shell alla volta e Qual è il modo migliore per garantire che sia in esecuzione una sola istanza di uno script Bash? per gli script di esempio.

Potenziali problemi

Ci sono casi limite.

launchd desidera che i lavori vengano eseguiti a meno n secondi prima della fine . Quando lo script trova un file di blocco esistente, considera di dormire per n secondi e poi di uscire.

Cosa succede se il tuo script viene ucciso o esce a causa di un errore? Puoi essere sicuro che il file di blocco sia stato rimosso?

In C, un trucco per garantire la rimozione di un file è quello di creare, aprire ed eliminare il file - un file cancellato mantenuto aperto su UNIX rimarrà fino alla chiusura del processo di apertura. Il file viene eliminato anche se il processo si blocca.

In uno script di shell, cattura il segnale di fine e assicurati che il file sia rimosso.

Un altro potenziale problema è il controllo del file esistente. Questo controllo potrebbe accadere fazioni di secondi prima che il copione precedente termini. Questo sarà raro ma possibile. L'approccio citato sopra afferma di superare questo.

    
risposta data 06.04.2018 - 09:11
fonte

Leggi altre domande sui tag