Systemd asılı işlemleri algılayıp öldürebilir mi?


16

Dosya kilitleme kullanan bir çözüm üzerinde çalışırken, kodumun bir kilitlenmeye başladığına inanıyorum. Sistem başlangıcında işlemi başlatmak için systemd kullanıyorum. Alarm (3) kullanmak bir seçenektir, ancak systemd'in asılı işlemleri algılayıp yeniden başlatmanın bir yolu olup olmadığını merak ediyordum?

Şu anda bu sorunu şimdilik atlatmak için, journalctl çıktısına bakmayı planlıyorum ve belirli bir süre boyunca değişmezse, bir kabuk betiği ile süreci öldürürüm.

İşlemleri sistemd veya başka bir yolla izlemenin daha iyi bir yolu olup olmadığını merak etmek.


Muhtemelen değil. Sürecin askıda kaldığını nasıl anlarsınız? Gerçekten böyle bir şeye ihtiyacınız varsa for(;;) do_something();?
mvp

4
Açıkçası, kodunuz asılı kalırsa bu sorunu ayıklamanız gerekir. Sistemd aracılığıyla öldürmek (varsayalım ki, inanmıyorum) ya da başka bir şekilde hata ayıklamak için yapılması gereken doğru şeydir. Ama bir çıkmaza girmek için onu serbest bırakamazsınız.
MariusMatutiae

Yanıtlar:


25

Evet; ama önce systemd ile uğraşmadan önce buggy programını düzeltin.

MariusMatutiae oldukça doğru. Programınızla ilgili bir sorununuz var. Kilitlenmeler. Sistemd ile uğraşmak cevap değil. En iyi ihtimalle dikkat dağıtıcı. Programınızı kırılmayacak şekilde düzeltin. Enerjilerinizi doğru olana yönlendirin.

Bununla birlikte, diğer insanlar uygun soru yerine soru başlığı nedeniyle buraya gelecekler. Yararları için, başlığın cevabı, soruyu doğru görmezden geliyor:

Evet, systemd konuşmaları izleyebilir ve konuşmayı bırakırlarsa otomatik olarak yeniden başlatabilir. Sadece eski dæmonslar da değil. MVP'nin belirttiği gibi, bir dæmon'un asıldığını bilmenin bir yolu yoktur (en azından durma sorununun kararsız olduğu bu evrende). Ne sistemd ne de başka bir bilgisayar programı, kendilerine atılan bazı rastgele programların kilitlendiğini ya da sonsuz bir döngüye ya da her neyse sıfırdan çıkarmayacaklardır. Burada elde edeceğiniz en iyi şey, bir dæmon'un gerekli bir zaman aralığında düzenli bir "kalp atışı" işlemi gerçekleştirmediğini tespit etmektir.

Bu nedenle, systemd'nin bekçi köpeği özelliklerinden yararlanan Dæmons'ın, sisteme özgü bir protokol olan sd_notify protokolünü konuşmak için yazılması gerekir. Bu dæmon kodunu biraz karmaşık hale getirir. Daha da karmaşıktır, çünkü dæmons düzgün yazılmışsa bekçi köpeği işlevi etkinken çağrılıp çağrılmadığını kontrol etmelidir.

Systemd'in bekçi köpeği yeteneğinden yararlanmak için bu protokolü konuşan bir dæmon…

  • WATCHDOG_USECOrtam değişkenini kontrol etmelidir ;
  • Sd_notify () işlevini kullanım süresi boyunca sürekli olarak ve sık sık, WATCHDOG=1seçenek kümesi ile yaklaşık WATCHDOG_USEC/ 2 aralığında ("USEC" mikrosaniye anlamına gelir) çağırmalıdır;
  • Type=notifyBirim dosyasında ayarlanmış olmalıdır ;
  • … Birim dosyasında NotifyAccess=main(veya =all) ayarlanmış olmalıdır ;
  • … Birim dosyasında WatchdogSec=saniyeler ayarlanmış olmalıdır .
  • … İle bağlantı kurmalı libsystemd-daemon.so

Bunu kodlamanın ayrıntılarını bilmek istiyorsanız, kılavuzu okuduktan sonra doğru StackExchange'e gittiğinizden emin olun. Bu SuperUser. StackOverflow orada .

daha fazla okuma


2
Tabii ki, sorunu düzeltmek zorundayım, tek amacım sorunu anlayana kadar geçici bir kesmekti. Detaylı cevap için teşekkürler.
freethinker
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.