Muszę monitorować kilka procesów uruchomionych na moim serwerze internetowym. Z jakiegoś powodu lakier obecnie ulega awarii raz dziennie lub dwa. Używam monit, aby podobno automatycznie uruchamiać lakier ponownie, ale to nie działa. Oto mój wpis monitor.conf dotyczący lakieru.
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
Plik dziennika pokazuje, że po zatrzymaniu działania lakieru próba rozpoczyna się ponownie, a następnie wszystkie kończą się niepowodzeniem. Następnie monitor ostatecznie przestaje monitorować lakier.
Czy ktoś ma sugestie, jak to naprawić? Albo jeszcze lepiej, czy możesz zasugerować inne proste sposoby automatycznego monitorowania i restartowania zawieszonych procesów? Dzięki!
Odpowiedzi:
Zajrzałbym do daemontools ( http://cr.yp.to/daemontools.html ).
Nadzór został zbudowany właśnie w tym celu - aby uruchomić procesy i je obserwować, natychmiast je restartując, jeśli kiedykolwiek zakończą się.
Nadal możesz użyć monitora, jeśli chcesz zrobić coś bardziej skomplikowanego niż proste sprawdzanie „czy nadal działa”, a jeśli proces wymaga ponownego uruchomienia, zrób to przez nadzór.
źródło
Możesz także użyć / etc / inittab, aby zrestartować martwe procesy za pomocą akcji respawn .
Zobacz sekcję inittab na http://aplawrence.com/Unixart/startup.html
źródło
Możesz używać skryptów obsługi zdarzeń w Nagios, jeśli masz to w celu zrestartowania usług.
Jeśli lakier wymaga uprawnień roota do uruchomienia (skrypty init.d zwykle tak robią) zmień „/etc/init.d/varnish start” na „sudo /etc/init.d/varnish start”. Ale to prawdopodobnie nie wystarczy, ponieważ prawdopodobnie nie chcesz nadawać cokolwiek działającego monitorowaniu jako całkowite uprawnienia sudo nopasswd do wszystkich poleceń, a dawanie sudo skryptowi powłoki byłoby w zasadzie równie złe. Musisz więc dowiedzieć się, które polecenia w tym skrypcie inicjującym potrzebują sudo, nadać tym komendom uprawnienia sudo w pliku / etc / sudoers użytkownikowi monitorowania, a następnie odpowiednio zmodyfikować ten skrypt inicjujący. A może zamiast tego całego lakieru można uruchomić jako użytkownik inny niż root?
Wreszcie jestem pewien, że o tym wiesz, ale i tak to powiem. Najwyraźniej wkładasz w to dużo wysiłku, mam nadzieję, że wkładasz tyle wysiłku w ustalenie, dlaczego lakier się rozbija, i naprawienie go (lub namawianie programistów, aby wymyślili dlaczego) :-)
Aktualizacja:
To może nie być tak czyste, ale łatwym sposobem na zrobienie tego jak root może być skonfigurowanie skryptu, który sprawdza, czy proces jest w porządku, a jeśli nie, to go uruchamia. Następnie po prostu uruchamiaj ten skrypt co kilka minut jako zadanie crona.
źródło
Kolejna świetna metoda zaczerpnięta z StackOverflow :
Można to dodać do crontab:
Następnie dodaj regułę, aby uruchomić skrypt monitorowania:
Lub dodany jako skrypt w
/etc/init.d
Zobacz odpowiedź StackOverflow, aby uzyskać szczegółowe wyjaśnienie, dlaczego jest to dobre podejście.
źródło
Szukałem również najprostszego sposobu rozwiązania tego problemu. Najprostszym sposobem, jaki mogłem znaleźć, jest po prostu dodać
Restart=allways
do odpowiedniego.service
pliku w/etc/systemd/system/multi-user.target.wants/
ostatnim wierszu[service]
tagu.Następnie wykonaj
sudo systemctl daemon-reload
następujące czynności,sudo systemctl restart service.service
aby ponownie załadować zmiany.Możesz przetestować, sprawdzając, czy usługa jest uruchomiona:
systemctl status processname
sprawdź znacznik czasu rozpoczęcia. Po tymps -ef | grep servicename
, reklama zabije proces z właśnie znalezionym identyfikatoremkill 1234
. potem zrób tosystemctl status processname
jeszcze raz i sprawdź, czy znacznik czasu rozpoczęcia jest zaktualizowany.Powinien działać na:
źródło