Linux'ta arıza durumunda bir hizmeti otomatik olarak nasıl yeniden başlatırım


23

Windows'ta, bir servis başarısız olduğunda / sırasında ne olacağını ayarlayabilirsiniz. Linux'ta aynı şeyi başarmanın standart bir yolu var mı (özellikle CentOS)?

Sorumun daha büyük bir kısmı şudur: açık bırakılmış yuvaları nasıl kullanıyorsunuz - örneğin, TIME_WAIT, FIN_WAIT1, etc durumlarında.

Şu anda geliştirmekte olduğum hizmetin çökmesi durumunda, el ile yeniden başlatabilmem için soketlerin dinleme bağlantı noktasını temizlemesini veya değiştirmesini beklemem gerekiyor.

Yardımın için teşekkürler.

Yanıtlar:


26

monitbaşarısız olduklarında hizmetleri izlemek ve yeniden başlatmak için harika bir yoldur - ve muhtemelen bunu diğer önemli hizmetler (Apache gibi) için kullanmanız gerekir. NixCraft'da bunun özellikle hizmetler için nasıl kullanılacağına dair ayrıntılı bir makale var , ancak monitbunun ötesinde çok daha fazla işlevi var.

Soket yönüne gelince, @galraen bu noktaya açık cevap verdi.


Ben hangi karar vermek zorunda yazık cevap. İki ayrı soru sormalıydım. @gelraen cevabınız az önce bir çözüm aramaya başladı. Teşekkür size o kadar çok! @Redmumba teşekkürler, Monit iyi görünüyor!
Pryo

Hangisini doğru seçmeye karar verirseniz verin, kesinlikle @ gelraen'in cevabını oylayın. Doğru ve çok bilgilendirici.
Andrew M.

19

Sadece servis cevaplama kısmı yeniden başlatılıyor. Ben de Monit ile karşılaştım, ancak CentOS 7 sistemindeki her şey sizin için önemli. Yalnızca bu iki satırı .service dosyasına eklemeniz gerekir (eğer orada değilse):

Restart=always
RestartSec=3

Başvuru için https://jonarcher.info/2015/08/ensure-systemd-services-restart-on-failure/ adresine bakın .

Özel bir sistem servisi oluşturmak istiyorsanız, kendi servis dosyanızı yazmak oldukça kolaydır. Özel bir http sunucusu için aşağıdaki örneğe bakın.

Editöre yeni bir servis dosyası ile başlayın:

vim /etc/systemd/system/httpd.service

Ve gerektiği şekilde düzenleyebileceğiniz aşağıdaki içeriği ekleyin:

[Unit]
Description=My httpd Service
After=network.target

[Service]
Type=simple
User=root
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PERLLIB=/perl
ExecStart=/bin/httpd /etc/httpd.conf
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

Açılışta otomatik olarak başlamasını istiyorum:

systemctl enable httpd

Systemd'ye değişiklikleri söyle ve servisi başlat:

systemctl daemon-reload
systemctl start httpd

Ve şimdi durumu görebilirsiniz:

systemctl status httpd

Başvuru için, https://scottlinux.com/2014/12/08/how-to-create-a-systemd-service-in-linux-centos-7/


Evet, kesinlikle systemd, en popüler dağıtımlardaki standart servis yöneticisi sizin için bunu yapabilir.
Rolf

13

setsockopt(2)Dinleme soketini arayabilir SO_REUSEADDR, böylece bind(2)tüm bağlantıları kesmeden beklemeniz mümkün olur . Başka bir olasılık: çekirdekten bağlantıları damla. FreeBSD'nin bunun için tcpdropemri var , Linux hakkında bilgim yok.


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.