Menyadari Anda baru saja berbagi dengan kami sebuah fragmen kode dan pada dasarnya tidak jelas apa yang ingin dicapai oleh daemon selain melakukan beberapa tindakan setiap detik. Jadi saya akan membuat beberapa asumsi hanya berdasarkan apa yang Anda tulis.
- Sepertinya Anda menggunakan lockfile untuk mencegah peluncuran duplikat.
- Tampaknya Anda perlu jebakan untuk membersihkan file kunci yang digunakan untuk mengimplementasikan tes Anda untuk memastikan singularitas.
- Selain itu tampaknya deamon Anda sedang melakukan sleep loop untuk bangun secara berkala dan melakukan beberapa tindakan. (Hanya tidur lebih banyak, dalam contoh Anda.)
Ini semua adalah masalah yang launchd dimaksudkan untuk diselesaikan dengan cara yang lebih baik di bawah Darwin (dan karenanya OS X).
Adapun pertanyaan (s) dengan membongkar dan SIGTERM, khususnya, ketika Anda unload
launchdeamon Anda dikirim SIGKILL bukan SIGTERM. Jika Anda hanya ingin menghentikan pekerjaan atau mengirimnya SIGTERM kemudian gunakan stop
sebagai gantinya unload
.
Jika Anda ingin SIGTERM dikirim, unload
Anda mungkin perlu mengatur EnableTransactions
. Demikian juga jika Anda memiliki tugas pembersihan dan Anda ingin deamon Anda menerima sinyal untuk pembersihan dan SIGTERM maka Anda harus menetapkan EnableTransactions
sebagai bagian dari launchd plist untuk skrip Anda. <key>EnableTransactions</key><true/>
. Ini dijelaskan dalam dokumen di https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.plist.5.html
Tetapi tiga mekanisme di atas tidak perlu diberikan launchd ...
Di bawah Darwin / OS X menggunakan launchdaemons, metode yang tepat untuk menerapkan sleep loop daemon adalah digunakan StartInterval
untuk berjalan pada interval atau StartCalendarInterval
untuk menjalankan berdasarkan pada waktu tertentu. Menggunakan StartCalendarInterval
tambahan juga memberikan keuntungan bahwa ketika sistem tertidur itu akan mengeksekusi waktu interval yang terjawab alih-alih harus menunggu interval berikutnya, dan umumnya apa yang Anda inginkan dalam situasi ini. Jika Anda memiliki pekerjaan yang Anda hanya ingin tetap dipanggil, pertimbangkan juga untuk menggunakan KeepAlive
sebagai bagian dari daftar.
Jadi sepertinya - dari contoh kode yang Anda berikan - Anda hanya ingin mengeksekusi sesuatu setiap 86400 detik. Jika hal ini terjadi maka launchd memiliki mekanisme untuk melakukan hal ini yang harus Anda gunakan sebagai gantinya dan meniadakan kebutuhan untuk file kunci dan perangkap sekaligus karena launchd dirancang untuk menangani semua ini untuk Anda secara otomatis. Mekanisme itu StartInterval
dan ketika ditetapkan akan meluncurkan deamon Anda setiap N detik. Launchd juga memastikan belum meluncurkan banyak salinan daemon Anda.
Mekanisme ini dijelaskan dalam dokumen launchd di https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.plist.5.html di mana ia menyatakan:
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.
Jadi skrip Anda yang ter-Darwin-kan ~/Downloads/Example.sh
akan terlihat sangat sederhana sekarang seperti ini:
#!/bin/sh
echo $(date +%R)' Running…' # or whatever it is you wanted to do on the interval
Dan daftar Anda akan terlihat seperti ini:
<?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>
Catatan Saya juga telah menyesuaikan ini untuk mengatur file logging di sini dengan cara seperti Darwin / launchd daripada dalam script itu sendiri. (Tentu saja Anda bisa menghapusnya dan menanganinya dalam skrip Anda, tetapi itu tidak perlu diberikan launchd.)
Saya perhatikan bahwa Anda juga dapat mengimplementasikan ini menggunakan Program
seperti:
<key>Program</key>
<string>sh</string>
<key>ProgramArguments</key>
<array>
<string>~/Downloads/Example.sh</string>
</array>
Anda juga dapat menemukan http://launchd.info referensi yang berguna bersama dengan dokumen Apple untuk bagaimana launchd beroperasi di https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/ Introduction.html
Informasi tentang daemon dijalankan secara berkala dapat ditemukan di
https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/ScheduledJobs.html#//apple_ref/doc/uid/10000172i-CH1-S2