Linux'ta durduğunda servis nasıl izlenir ve yeniden başlatılır


24

Aslında Shell Script'leri mi kullanmam gerektiğinden veya zaten bazı yollar olup olmadığından emin değilim. Ancak, hangi yaklaşımı kullanırsak kullanın, bir Hizmeti her zaman çalışır durumda tutmak istiyorum.

iptablesÖrnek olarak diyelim . Sonra ..

  • iptablesHizmetin ne zaman çalıştığı stoppedveya (başka bir deyişle) çalışmadığı zaman, durduğunda (veya çalışmadığında) otomatik olarak started(veya restarted) .. olmasını istiyorum .
  • Daha basit bir deyişle, bir Hizmeti her zaman çalışır durumda ve çalışır durumda tutmak istiyorum .

( Gerçek zamanlı kontrol yapmak sorun ise, kontrol etmek için makul bir frekans verebilirim . Her 5 dakikada bir diyelim)

Düşünebilmemin tek yolu, Shell Script'leri Cron Tab ile kullanmak.

  • Herhangi bir akıllı çözüm var mı?

Teşekkürler!


Bunu yapmamalısın. Bir hizmetin kötü yapılandırıldığını varsayalım, stratejiniz ne elde eder? Sonsuz bir alım listesi. Bunun yerine, alertsçalışmayan bir şeye size bir crontab betiği yazmalısınız .
MariusMatutiae,

Sadece asıl soru için doğru çözümü merak ediyorum. Ayrıca, restartedherhangi bir nedenle, ne zaman durduğunda basitçe olması gereken bir Hizmetim var . Yeniden başlatmayla ilgili sorun yok.

1
Kendi önerdiğin çözüm yeterince akıllı. Doğru kullanıyorsanız (servis zaten çalışıyorsa hemen çıkın, servisin durduğunu ve onu düzeltebilmeniz için sizi durdurduğunu söyleyin, vb.) En basit yoldur. Otomatik olarak duran bir servis sorunlu bir servistir, bu yüzden sonunda düzeltmelisiniz, ancak aksi halde geçici bir yama, bir cron betiği veya çoğu zaman uyuyan başka bir süper basit bir arka plan programı işi iyi sonuçlandıracaktır. Mmonit.com/monit gibi bazı araçlar var ancak sonuçta hepsinin de benzer bir yaklaşım kullandığını düşünüyorum

@ MariusMatutiae, amacınla aynı fikirdeyim ama bu hizmetin niteliğine bağlı ve çoğu süreç yöneticisi birkaç başarısız yeniden başlatma işleminden sonra geri çekilecek. Bir sürecin doğal olarak sona ermesi ve otomatik olarak yeniden başlatmak istememiz, örneğin bir işi kuyruktan alan ve her çalıştırmadan sonra biten bir işçi için son derece makul. Ayrıca, ısmarlama bellek sızdıran koddan muzdarip olan sistem yöneticileri için kullanışlı bir araçtır - işlemin ömrünü sınırlandırın ve kullanımdan çıkmadan önce otomatik olarak yeniden başlatın ...
Alex Forbes

Yanıtlar:


25

Mart 2018 Güncellemesi

Bu cevap şimdi oldukça eski ve yazıldığı için sistemd Linux'ta pid1 savaşını kazandı. Böylece, muhtemelen bir oluşturmalısınız systemd systemd (bunların çoğu ise) Dagitiminiza inşa edilirse, üniteyi.

Aşağıdaki cevap gelecek nesiller için korunur.


Yukarıdaki takma cevap geçerli, ancak bazı alternatiflerden bahsedeceğimi düşündüm:

İşletim sisteminizin işlem yönetimi sorununu zaten çözdüğünü unutmayın. Geleneksel olarak Linux, temelde init.d'de gördüğünüz komut dizilerinin koleksiyonu olan sysvinit'i kullandı. Ancak oldukça aptal ve süreçleri izleyemiyorum, init.d scriptleri karmaşık ve iyi bir sebepten dolayı değiştiriliyor.

Daha modern işletim sistemleri, svinvinitin yerini almaya başlıyor ve öncüleri Upstart ve Systemd. Debian sistemdekilere yaslanıyor, Ubuntu gelişti ve hemen hemen Upstart'a geçti ve Debian Redhat / CentOS / Fedora'nın sistemdeye doğru ilerlemesi gibi. Bu nedenle, zaten sysvinit'in yerini alan bir işletim sistemi kullanıyorsanız, yerleşik olanı kullanmanızı öneririm. Scriptleri yazmak, init scriptlerinden daha kolaydır.

Runit kullandım ve çok beğendim, fakat kullanımı en kolay süpervizör. Ayrıca çok iyi belgelenmiştir, neredeyse her yerde çalışır ve tüm büyük dağıtımlarda paketlenir.

Ancak ne yaparsanız yapın, lütfen, lütfen bir kabuk betiği kullanmayın. Bu yaklaşımda çok yanlış şeyler var!


sysvinit ile nasıl yapılır?
horseyguy

12

iptablesgerçekten çalışan bir hizmet veya arka plan programı değil, çekirdeğin bir parçası olduğu için kötü bir örnektir. Gerçekten “durduramazsınız” iptables, sadece bir konfigürasyon verebilirsiniz ve “durdurarak” boş bir konfigürasyon vermeyi içerir. Aslında, Linux sistemleri çöktü, ancak bağlantı noktası iletme kurulumunu kullanmaya iptablesdevam ediyor.

Neyse, bir yardımcı program monitne istersen onu yapacak. Debian kullanıyorsanız, bu bir apt-get install monituzakta. Bunu öğrenmek biraz dahil ama çok esnek.


3

Bu basit betiği, uyarı vermek ve çalışmıyorsa, hizmeti başlatmak için kullanıyoruz. Siz de daha fazla servis ekleyebilirsiniz.

 file name: uptime.sh

 #!/bin/bash
 #service monitoring
 /bin/netstat -tulpn | awk '{print $4}' | awk -F: '{print $4}' | grep ^80$ > /dev/null   2>/dev/null
 a=$(echo $?)
 if test $a -ne 0
 then
 echo "http service down" | mail -s "HTTP Service DOWN and restarted now" root@localhost
 /etc/init.d/httpd start > /dev/null 2>/dev/null
 else
 sleep 0
 fi
 /bin/netstat -tulpn | awk '{print $4}' | awk -F: '{print $4}' | grep ^53$ > /dev/null   2>/dev/null
 b=$(echo $?)
 if test $b -ne 0
 then
 echo "named service down" | mail -s "DNS Service DOWN and restarted now" root@localhost
 /etc/init.d/named start > /dev/null 2>/dev/null
 else
 sleep 0
 fi

 Cron setup:
 */5 * * * * /root/uptime.sh > /dev/null 2>/dev/null

MariusMatutei'nin noktası doğru ancak sunucumdaki HTTPD ve DNS hizmetini izlemek için basit bir komut dosyası yaptık ve bu durum iyi çalışıyor. Her ne zaman hizmet kapalıyken, komut dosyası hizmeti yeniden başlatır ve bize bir uyarı verir, Hizmetle ilgili olarak çok sayıda uyarı / posta alırız, sonra bir araştırma yapabiliriz.
Ranjithkumar T


0

Sorunun sorulmasından bu yana birkaç yıl geçtiğini biliyorum. ancak systemd ile (çoğunlukla centos ve REHL ile kullanılabilir), servisin yetersiz olup olmadığını kontrol etmek ve yeniden başlatmak için bu bash komutunu cron ile çalıştırabilirsiniz.

#!/bin/bash

service=$@
/bin/systemctl -q is-active "$service.service"
status=$?
if [ "$status" == 0 ]; then
    echo "OK"
else
    /bin/systemctl start "$service.service"
fi

bin dizinine kaydedin ve monitör gibi adlandırın. Uygun dosya izni verin. sonra gibi koş

sudo monitor redis

redis servisini kontrol etmek ve gerekirse yeniden başlatmak / başlatmak isterseniz.

Son olarak cron işinize bunu ekleyin.

umarım bu yardımcı olur


0

Uzun bir init / svc denetim listesine eklemek için, S6'nın bir alt dizini olarak blokta (66) s6 servis yönetimini yapan ve hızlı, hafif ve kullanıcı dostu bir şekilde giriş yapan yeni bir çocuk var. Bu, Obarun-Linux için resmi belgelere bağlantı https://web.obarun.org/software

Bu, bu 66 yazılımının nasıl kullanılacağı ve s6'nın nasıl anlaşılacağı hakkında bir SSS'dir. Http://sysdfree.wordpress.com/266

Kararlı sürüm 4.20 -> 5.0 arasındaki çekirdek değişiklikleriyle ilgili tek bir hata bulunduğundan, bildirilen diğer tüm sorunların yeni bir şeyler öğrenen insanlarla yapması gerekiyordu. Eğer servis yönetimi bundan daha basit hale gelmek zorundaysa, ms-windows'a (Linus forbid) geçmek daha iyi olabilirdi. Gerçek hayatta bunun nasıl işe yarayacağını görmek için sadece bir Obarun live.iso indirmeniz ve onunla oynamanız yeterli. Servisleri kurmak ve onların 66-scriptleri onları mümkün kılar, öldürür, kayıtlarını görür, durdurur ve başlatır (etkinken), hizmetleri bir ağaca toparlar ve hizmet ağaçlarının hepsini birlikte başlatıp durdururlar, kullanıcı düzeyinde hizmetleri ayrı tutarlar. sistemden. S6'nın iyi yaptığını yapar ve kullanıcının s6 altındaki kurşun geçirmez sistemden yararlanmasını kolaylaştırır.

Görüntü indirme işlemleri burada bulunabilir: https://web.obarun.org/index.php?id=74 md5 dosyaları kontrol et https://repo.obarun.org/iso/

Init ve servis yönetimi dışında s6 / 66, sistemdeki hiçbir şeyden bağımsız değildir. Yazılımın geri kalanını kendi init / svc-mgmt körlerinde çalışacak şekilde bırakan temel sistem katmanıdır. Tüm s6 ve 66, C dilinde yazılmıştır ve linux'a özgü veya glibc'e özgü değildir. Skarnet'in (s6 yazarları) sunucuları, musl özel yapım sisteminde çok fazla duraksama olmadan neredeyse on yıldır çalışıyor. Alpine, Void ve Adelie'nin şu anda depolarında s6 yazılımı var, Adelie varsayılan olarak servis denetimi için kullanıyor. Artık Void 66'yı da taşıyor. Birisinin s6'yı xxBSD'ye veya diğer xxIX sistemlerine aktarıp taşımadığını ve ne ölçüde genişlettiğini bilmiyorum.

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.