Comprendendo che hai appena condiviso con noi un frammento di codice essenzialmente e non è chiaro quale altro demone stia cercando di ottenere effettivamente altro che eseguire un'azione ogni tanto. Quindi farò alcune ipotesi basandomi su ciò che hai scritto.
- Sembra che tu stia utilizzando il file di blocco per impedire l'avvio duplicato.
- Sembra quindi che sia necessario il trap per ripulire il file di blocco utilizzato per implementare il test per garantire la singolarità.
- Inoltre, sembra che il tuo deamon stia facendo un ciclo del sonno per svegliarsi periodicamente ed eseguire un'azione. (Basta dormire di più, nel tuo esempio.)
Questi sono tutti problemi che launchd intende risolvere in modi migliori con Darwin (e quindi con OS X).
Come per le domande con lo scaricamento e SIGTERM, in particolare, quando unload
il tuo launchdeamon viene inviato un SIGKILL invece di un SIGTERM. Se si desidera interrompere il lavoro o inviarlo a SIGTERM, utilizzare stop
anziché unload
.
Se vuoi che un SIGTERM sia inviato su unload
potresti aver bisogno di impostare EnableTransactions
. Allo stesso modo, se hai compiti di pulizia e vuoi che i tuoi deamon ricevano i segnali per la pulizia e SIGTERM, allora devi impostare EnableTransactions
come parte del launch plist per il tuo script. %codice%. Questo è descritto nei documenti all'indirizzo link
Ma i tre meccanismi di cui sopra non sono necessari dato launchd ...
Sotto Darwin / OS X utilizzando launchdaemons, il metodo appropriato per implementare un daemon del ciclo sleep consiste nell'utilizzare <key>EnableTransactions</key><true/>
per l'esecuzione su un intervallo o StartInterval
per l'esecuzione in base a orari specifici. L'utilizzo di StartCalendarInterval
offre inoltre il vantaggio che quando il sistema è in sospensione eseguirà un intervallo di tempo mancante anziché dover attendere l'intervallo successivo ed è generalmente ciò che si desidera in queste situazioni. Se hai un lavoro che vuoi semplicemente invocare, considera anche l'utilizzo di StartCalendarInterval
come parte del plist.
Quindi sembra - dall'esempio di codice che hai fornito - vuoi eseguire qualcosa ogni 86400 secondi. Se questo è il caso, launchd ha un meccanismo per fare ciò che dovresti usare e invece elimina la necessità del tuo file di lock e del trap del tutto dato che launchd è progettato per gestire tutto questo automaticamente per te. Quel meccanismo è KeepAlive
e, quando definito, lancerà il tuo demone ogni N secondi. Launchd si assicura anche che non abbia lanciato più copie del demone.
Questo meccanismo è descritto nei documenti di avvio all'indirizzo link dove afferma:
StartInterval <integer>
This optional key causes the job to be started every N seconds. If the system is
asleep, the job will be started 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 il tuo script di% di Darwin% co_de sembrerebbe qualcosa di molto semplice ora in questo modo:
#!/bin/sh
echo $(date +%R)' Running…' # or whatever it is you wanted to do on the interval
E il tuo plist sarebbe simile a questo:
<?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>org.example</string>
<key>ProgramArguments</key>
<array>
<string>sh</string>
<string>~/Downloads/Example.sh</string>
</array>
<key>EnableGlobbing</key>
<true/>
<key>StartInterval</key>
<integer>86400</integer>
<key>StandardOutPath</key>
<string>/mypathtolog/myjob.log</string>
<key>StandardErrorPath</key>
<string>/mypathtolog/myjob.log</string>
</dict>
</plist>
Nota Ho anche regolato questo per impostare i file di registrazione qui in un modo Darwin / launchd come invece che nello script stesso. (Potresti ovviamente rimuoverli e gestirli nello script ma non è necessario dato launchd.)
Rilevo che potresti anche implementarlo utilizzando StartInterval
in questo modo:
<key>Program</key>
<string>sh</string>
<key>ProgramArguments</key>
<array>
<string>~/Downloads/Example.sh</string>
</array>
Potresti anche trovare link un utile riferimento oltre ai documenti Apple per come funziona launchd su link
Le informazioni sui daemon eseguite periodicamente possono essere trovate su
collegamento