Dapatkah systemd mendeteksi dan membunuh proses yang digantung?

16

Saat bekerja pada solusi yang menggunakan penguncian file, saya percaya kode saya mengalami kebuntuan. Saya menggunakan systemd untuk memulai proses startup sistem. Menggunakan alarm (3) adalah sebuah pilihan, tetapi saya bertanya-tanya apakah ada cara bagi systemd untuk mendeteksi proses yang digantung dan memulai kembali?

Saat ini untuk menghindari masalah ini untuk saat ini, saya berencana untuk melihat output journalctl dan jika itu tidak berubah untuk waktu yang ditentukan, maka saya akan mematikan proses melalui skrip shell.

Hanya ingin tahu apakah ada cara yang lebih baik untuk memantau proses melalui systemd atau sebaliknya.

pemikir bebas
sumber
Mungkin tidak. Bagaimana Anda tahu jika proses digantung? Bagaimana jika Anda benar - benar membutuhkan sesuatu for(;;) do_something();?
mvp
4
Sebenarnya, jika kode Anda hang Anda harus men-debug masalah itu. Membunuh melalui systemd (seandainya itu bisa dilakukan, yang saya tidak percaya) atau dengan cara lain adalah hal yang tepat untuk dilakukan saat Anda men-debug-nya. Tapi Anda tidak bisa membiarkannya bebas dari kebuntuan.
MariusMatutiae

Jawaban:

25

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_USECvariabel lingkungan;
  • … Harus memanggil sd_notify () secara terus-menerus dan sering, sepanjang masa pakainya, dengan WATCHDOG=1set opsi, pada interval sekitar WATCHDOG_USEC/ 2 ("USEC" adalah singkatan dari microseconds);
  • ... harus sudah Type=notifydiatur 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

JdeBP
sumber
2
Tentu saja, saya harus memperbaiki masalah ini, satu-satunya niat saya adalah melakukan peretasan sementara sampai saya mengetahui masalahnya. Terima kasih atas jawaban terinci.
Pemikir bebas