Jak monitorować usługę i zrestartować, jeśli zostanie zatrzymany w systemie Linux

24

Właściwie nie jestem pewien, czy powinienem używać Skryptów Shell, czy też istnieją już jakieś sposoby. Ale bez względu na to, jakie zastosujemy podejście, chciałbym, aby Usługa działała cały czas.

Powiedzmy iptablesjako przykład. Następnie ..

  • Ilekroćiptables usługa jest stoppedlub (innymi słowy) nie działa, chcę go mieć started(lub restarted) .. automatycznie , gdy tylko przestał (lub nie działa).
  • Innymi słowy, chcę, aby Usługa działała cały czas.

(Być może mógłbym podać uczciwą częstotliwość do sprawdzenia, jeśli problem stanowi sprawdzanie w czasie rzeczywistym . Powiedzmy, że co 5 minut)

Jedynym sposobem, jaki mogłem wymyślić, jest użycie Skryptów powłoki z Cron Tab.

  • Czy jest jakieś inteligentne rozwiązanie?

Dzięki!

夏 期 劇場
źródło
Nie powinieneś tego robić. Załóżmy, że usługa jest źle skonfigurowana, co osiągnęłaby Twoja strategia? Nieskończona lista powtórzeń. Zamiast tego powinieneś napisać skrypt crontab, alertsże do czegoś nie działa.
MariusMatutiae,
Jestem ciekawy prostego rozwiązania pierwotnego pytania. Mam też usługę, która musi być po prostu restartedza każdym razem, gdy zostanie zatrzymana, z dowolnego powodu. Nie ma problemu z ponownym uruchomieniem.
夏 期 劇場
1
Twoje własne sugerowane rozwiązanie jest wystarczająco inteligentne. Jeśli użyjesz go poprawnie (wyjdź natychmiast, jeśli usługa jest już uruchomiona, ostrzeż, że usługa została zatrzymana, abyś mógł ją naprawić itd.). Jest to najprostszy sposób. Usługa, która zatrzymuje się automatycznie, jest usługą problematyczną, więc w końcu powinieneś ją naprawić, ale w przeciwnym razie, jako tymczasowa łatka, skrypt cron lub inny super-prosty demon, który śpi przez większość czasu, dobrze sobie poradzi. Istnieje kilka narzędzi, takich jak mmonit.com/monit, ale myślę, że ostatecznie wszystkie używają podobnego podejścia
@MariusMatutiae, zgadzam się z twoim punktem, ale zależy to od charakteru usługi, a większość menedżerów procesów wycofuje się po kilku nieudanych restartach. Jest całkowicie uzasadnione, aby proces naturalnie się zakończył, a my chcemy go zrestartować automatycznie, np. Pracownik, który odbiera zadanie z kolejki i kończy się po każdym uruchomieniu. Jest to również przydatne narzędzie dla administratorów systemów, którzy cierpią na niestandardowy kod wycieku pamięci - ogranicz czas życia procesu i uruchom go ponownie automatycznie, zanim wymknie się spod kontroli ...
Alex Forbes

Odpowiedzi:

25

Aktualizacja marca 2018 r

Ta odpowiedź jest teraz dość stara i od czasu jej napisania systemd wygrał wojnę z pid1 na Linuksie. Dlatego prawdopodobnie powinieneś utworzyć jednostkę systemd , jeśli systemd jest wbudowany w twoją dystrybucję (która jest ich większość).

Poniższa odpowiedź została zachowana dla potomności.


Powyższa odpowiedź na monit jest poprawna, ale pomyślałem, że wspomnę o kilku alternatywach:

Warto pamiętać, że Twój system operacyjny już rozwiązał problem zarządzania procesami. Tradycyjnie Linux używa sysvinit, który jest w zasadzie zbiorem skryptów widocznych w init.d. Jednak jest dość głupi i nie może monitorować procesów, skrypty init.d są skomplikowane i są wymieniane z ważnego powodu.

Bardziej nowoczesne systemy operacyjne zaczynają zastępować sysvinit, a przodującymi są Upstart i Systemd. Debian skłania się ku systemd, Ubuntu rozwinął się i już prawie przeszedł na Upstart i podobnie jak Debian Redhat / CentOS / Fedora przechodzą na systemd. Dlatego jeśli używasz systemu operacyjnego, który już zastąpił sysvinit, zaleciłbym użycie wbudowanego. Skrypty są znacznie łatwiejsze do napisania niż skrypty init.

Użyłem runit i całkiem mi się podoba, ale najłatwiejszy w użyciu jest superwizor. Jest również bardzo dobrze udokumentowany, działa prawie wszędzie i jest pakowany we wszystkich głównych dystrybucjach.

Ale cokolwiek zrobisz, proszę, nie używaj skryptu powłoki. Jest tak wiele rzeczy złych w tym podejściu!

Alex Forbes
źródło
jak to zrobić za pomocą sysvinit?
horseyguy
12

iptablesjest kiepskim przykładem, ponieważ tak naprawdę nie jest uruchomiona usługa lub demon, ale część jądra. Nie można tak naprawdę „zatrzymać” iptables, można jedynie nadać mu konfigurację, a „zatrzymanie” oznacza nadanie mu pustej konfiguracji. Rzeczywiście miałem awarię systemów Linux, ale konfiguracja przekierowania portów iptablesnadal działa.

W każdym razie narzędzie o nazwie monitzrobi to, co chcesz. Jeśli używasz Debiana, nie ma apt-get install monitgo. To trochę wymaga poznania, ale bardzo elastyczne.

LawrenceC
źródło
3

Używamy tego prostego skryptu, aby ostrzec i uruchomić usługę, jeśli nie jest uruchomiona. Możesz też dodać więcej usług.

 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
Ranjithkumar T.
źródło
Punkt MariusMatutiae jest poprawny, ale zrobiliśmy prosty skrypt do monitorowania usługi HTTPD i DNS na moim serwerze, działa poprawnie. Kiedy usługa zostanie wyłączona, skrypt uruchomi ją ponownie i powiadomi nas. Otrzymujemy mnóstwo alertów / e-maili dotyczących usługi, wtedy możemy przeprowadzić dochodzenie w tej sprawie.
Ranjithkumar T
0

Wiem, że minęło kilka lat, odkąd pytanie zostało zadane. ale przy pomocy systemd (głównie dostępne z centos i REHL) możesz uruchomić to polecenie bash z cronem, aby sprawdzić i zrestartować, jeśli usługa nie działa.

#!/bin/bash

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

zapisz go w katalogu bin i nazwij jak monitor. Daj odpowiednie uprawnienia do pliku. następnie uruchom go jak

sudo monitor redis

jeśli chcesz sprawdzić usługę redis i ponownie uruchomić / uruchomić w razie potrzeby.

na koniec dodaj to do swojej pracy crona.

mam nadzieję, że to pomoże

Ahmad Sajid
źródło
0

Aby dodać do długiej listy nadzoru init / svc, jako podkatalog S6, w bloku znajduje się nowy dzieciak, 66, który obsługuje zarządzanie usługami s6 i logowanie w szybki, lekki i przyjazny dla użytkownika sposób. To jest link do oficjalnej dokumentacji dla Obarun-Linux https://web.obarun.org/software

To jest FAQ dotyczące korzystania z tego oprogramowania 66 i sensu s6 http://sysdfree.wordpress.com/266

Od czasu jego stabilnego wydania znaleziono tylko jeden błąd związany ze zmianami jądra od 4.20 -> 5.0, wszystkie inne zgłaszane problemy dotyczyły ludzi uczących się czegoś nowego. Gdyby zarządzanie usługami stało się prostsze, lepszym rozwiązaniem może być przejście na MS-Windows (Linus forbid). Aby zobaczyć, jak to działa, wystarczy pobrać plik Obarun live.iso i grać z nim. Zainstaluj usługi, a ich 66-skrypty umożliwią im, zabij je, zobacz ich logi, zatrzymaj je i uruchom (jeśli są włączone), zgrupuj usługi w drzewo i niech drzewa usług będą uruchamiać i zatrzymywać wszystkie razem, mieć usługi na poziomie użytkownika osobno z systemu. Robi to, co robi s6, i ułatwia użytkownikowi wykorzystanie kuloodpornego systemu pod s6.

Pliki do pobrania można znaleźć tutaj: https://web.obarun.org/index.php?id=74 md5 sprawdź pliki https://repo.obarun.org/iso/

Oprócz init i zarządzania usługami s6 / 66 nie mają żadnych zależności od innych elementów systemu. Jest to warstwa systemu podstawowego, pozostawiając resztę oprogramowania do samodzielnej pracy, init / svc-mgmt. Wszystkie s6 i 66 są napisane w C i nie są specyficzne dla Linux-a ani glibc. Serwery Skarneta (autorzy s6) działają od prawie dekady bez wielu przerw na niestandardowym systemie muzycznym. Alpine, Void i Adelie mają obecnie również oprogramowanie s6 w swoich repozytoriach, Adelie domyślnie używa go do nadzoru serwisowego. Pustka przenosi teraz także 66. Nie wiem, czy i w jakim stopniu ktokolwiek przeniósł s6 na system xxBSD lub inne systemy xxIX.

Gus Fun
źródło