Iya; tapi pertama-tama perbaiki program kereta Anda sebelum mengutak-atik systemd.
MariusMatutiae cukup benar. Anda memiliki masalah dengan program Anda. Itu jalan buntu. Mengotak-atik systemd bukanlah jawabannya. Paling-paling, itu gangguan. Perbaiki program Anda sehingga tidak rusak. Arahkan energi Anda pada hal yang benar.
Yang mengatakan, orang lain akan datang ke sini karena judul pertanyaan, bukan pertanyaan yang tepat. Demi keuntungan mereka, inilah jawaban untuk judul itu, mengabaikan pertanyaan yang pantas:
Ya, systemd dapat memonitor demon dan me-restart secara otomatis jika mereka berhenti berbicara. Bukan hanya sembarang demon tua. Seperti yang dicatat oleh mvp, tidak ada cara untuk mengetahui bahwa demon telah menggantung (di alam semesta ini, di mana masalah penghentian tidak dapat diputuskan, setidaknya). Baik systemd maupun program komputer lainnya tidak akan mampu menyimpulkan dari awal bahwa beberapa program acak yang dilemparkan pada mereka telah menemui jalan buntu, atau pergi ke loop tak terbatas, atau apa pun. Yang terbaik yang akan Anda dapatkan di sini adalah mendeteksi bahwa demon tidak melakukan operasi "detak jantung" secara teratur dalam rentang waktu yang diperlukan.
Karena itu, mengambil keuntungan dari kemampuan pengawas systemd, oleh karena itu, harus ditulis untuk berbicara protokol sistem-spesifik, protokol sd_notify. Ini menyulitkan kode demon sedikit. Ini lebih rumit karena demon harus, jika ditulis dengan benar, memeriksa apakah mereka telah dipanggil dengan fungsi pengawas diaktifkan, juga.
Sebuah demon yang berbicara protokol ini untuk memanfaatkan kemampuan pengawas systemd ...
- ... harus memeriksa
WATCHDOG_USEC
variabel lingkungan;
- … Harus memanggil sd_notify () secara terus-menerus dan sering, sepanjang masa pakainya, dengan
WATCHDOG=1
set opsi, pada interval sekitar WATCHDOG_USEC
/ 2 ("USEC" adalah singkatan dari microseconds);
- ... harus sudah
Type=notify
diatur dalam file unitnya;
- … Harus memiliki
NotifyAccess=main
(atau =all
) mengatur file unitnya;
- ... harus memiliki
WatchdogSec=
detik yang ditetapkan dalam file unitnya.
- ... harus terhubung dengan
libsystemd-daemon.so
Jika Anda ingin mengetahui detail pengkodean ini, setelah membaca manual, pastikan Anda membuka StackExchange yang tepat. Ini adalah SuperUser. StackOverflow ada di sana .
Bacaan lebih lanjut
for(;;) do_something();
?