Çökmüş işlemleri yeniden başlatmanın kolay yolu?


10

Web sunucumda çalışan birkaç işlemi izlemem gerekiyor. Herhangi bir nedenle, vernik şu anda günde bir veya iki kez çöküyor. Ben vernik otomatik olarak yeniden başlatmak için monit kullanıyorum, ama çalışmıyor. İşte Vernik için monit.conf girdim.

check process varnish with pidfile /var/run/varnish.pid
    start program = "/etc/init.d/varnish start" with timeout 60 seconds
    stop program = "/etc/init.d/varnish stop"
    if failed host <my server ip> port 80 protocol http
        and request "/blank.html" then restart
    if 3 restarts within 5 cycles then timeout
    group server

Günlük dosyası, vernik durduktan sonra, denemenin yeniden başlatılmasının ardından tümünün başarısız olduğunu gösterir. Daha sonra monit verniği izlemeyi durdurur.

Bunu nasıl düzeltebileceğim konusunda önerisi olan var mı? Ya da daha iyisi, çökmüş işlemleri otomatik olarak izlemenin ve yeniden başlatmanın diğer basit yollarını önerebilir misiniz? Teşekkürler!


bu tür şeylerin sistem öncesi zamanlarda ne kadar zor olduğuna inanamıyorum.
Fl0v0

Yanıtlar:


17

Daemontools'a bakardım ( http://cr.yp.to/daemontools.html ).

Denetim tam olarak bu amaç için inşa edildi - süreçleri başlatmak ve izlemek, herhangi bir şekilde feshedildiklerinde derhal yeniden başlatmak.

Basit bir "hala çalışıyor mu" kontrolünden daha karmaşık bir şey yapmanız gerekiyorsa ve yine de işlemin yeniden başlatılması gerekiyorsa, denetleme yoluyla bunu yapabilirsiniz.


Daemontools'u da dengesiz hizmet süreçlerini izlemek için kullanıyorum. Söylemem gerekirse oldukça kullanışlı. :-)
edomaur

4

Yeniden doğma eylemini kullanarak ölü işlemleri yeniden başlatmak için / etc / inittab komutunu da kullanabilirsiniz .

Http://aplawrence.com/Unixart/startup.html adresindeki inittab bölümüne bakın.


2

Hizmetleri yeniden başlatmak için uygulamanız varsa , olay işleyici komut dosyalarını Nagios ile birlikte kullanabilirsiniz .

Vernik başlaması için kök iznine ihtiyaç duyarsa (init.d betikleri genellikle yapar) "/etc/init.d/varnish start" ı "sudo /etc/init.d/varnish start" olarak değiştirin. Ancak muhtemelen tüm komutlara toplam sudo nopasswd ayrıcalıkları olarak kullanıcı monitini çalıştırmak istediklerini vermek istemezsiniz ve kabuk komut dosyasına sudo vermek temelde kötü olur. Bu nedenle, bu init komut dosyasında hangi komutların sudo'ya ihtiyacı olduğunu anlamanız, bu komutlara / etc / sudoers dosyasındaki sudo ayrıcalıklarını monit kullanıcısına vermeniz ve son olarak bu init komut dosyasını buna göre düzenlemeniz gerekir. Ya da belki tüm bu vernik yerine kök olmayan kullanıcı olarak çalıştırılabilir?

Sonunda, bunu bildiğinizden eminim ama yine de söyleyeceğim. Açıkça bu konuda çok çaba sarf ediyorsun, umarım verniğin neden çöktüğünü ve aslında onu düzelttiğini (veya geliştiricileri nedenini bulmak için taciz ederek) bulmak için çok çaba harcıyorsun :-)

Güncelleme:
Bu kadar temiz olmayabilir, ancak bunu kök olarak yapmanın kolay bir yolu, sürecin iyi olup olmadığını kontrol eden bir komut dosyası oluşturmak olabilir ve başlatır. Sonra bu betiği her iki dakikada bir cron işi olarak çalıştırın.


İlk önce Nagios'u düşündüm, ama amacım için küçük ve basit bir şey istedim. Ve evet, Vernik konusunu inceliyorum. Sunucularımdan biri uzun süredir istikrarlı çalışıyor, bu yüzden kesinlikle benimle ilgisi var. :(
Lin

1

StackOverflow'dan alınan bir başka harika yöntem :

until myserver; do
    echo "Server 'myserver' crashed with exit code $?.  Respawning.." >&2
    sleep 1
done

Bu crontab'a eklenebilir:

crontab -e

Ardından, monitör komut dosyanızı başlatmak için bir kural ekleyin:

@reboot /usr/local/bin/myservermonitor

Veya içine komut dosyası olarak eklendi /etc/init.d

Bunun neden iyi bir yaklaşım olduğuna dair ayrıntılı bir açıklama için StackOverflow yanıtına bakın .


0

Ayrıca bu sorunu çözmenin en basit yolunu arıyordum. Bulabildiğim en kolay yol Restart=allways, ilgili .servicedosyaya etiketin /etc/systemd/system/multi-user.target.wants/son satırı olarak eklemektir [service].

Bundan sonra değişiklikleri yeniden yüklemek için sudo systemctl daemon-reloadbunu yapın sudo systemctl restart service.service.

Hizmetin çalışıp çalışmadığını kontrol ederek test edebilirsiniz: systemctl status processnamebaşlangıç ​​zaman damgasını kontrol edin. Bundan sonra ps -ef | grep servicename, reklam yeni bulunan kimlikle işlemi öldürür kill 1234. bundan sonra systemctl status processnametekrar yapın ve başlangıç ​​zaman damgasının güncellenip güncellenmediğini kontrol edin.

Çalışması gerekenler:

  • Debian 7 ve Debian 8
  • Ubuntu 15.04 ve daha yenisi
  • CentOS 7 ve vadeli işlem
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.