Jak automatycznie zrestartować usługę w przypadku awarii w systemie Linux

23

W systemie Windows możesz ustawić, co powinno się stać, jeśli / kiedy usługa ulegnie awarii. Czy istnieje standardowy sposób osiągnięcia tego samego w systemie Linux (w szczególności CentOS)?

Większa część mojego pytania brzmi: jak radzić sobie z gniazdami, które pozostały otwarte - na przykład w stanach TIME_WAIT, FIN_WAIT1 itd.

W chwili, gdy usługa, którą rozwijam, ulega awarii, muszę poczekać, aż gniazda wyczyszczą się lub zmienią port nasłuchiwania, zanim będę mógł go ponownie uruchomić ręcznie.

Dzięki za pomoc.

Pryo
źródło

Odpowiedzi:

26

monitto świetny sposób na monitorowanie i restartowanie usług, gdy ulegną awarii - i prawdopodobnie skończysz na tym w przypadku innych niezbędnych usług (takich jak Apache). Jest ładny artykuł na temat nixCraft, szczegółowo opisujący, jak używać tego do usług, chociaż monitsam ma o wiele więcej funkcji poza tym.

Jeśli chodzi o aspekt gniazda, @galraen odpowiedział na to miejsce.

Andrew M.
źródło
To wstyd muszę zdecydować, co jest odpowiedź. Powinienem był zadać dwa osobne pytania. @gelraen twoja odpowiedź właśnie zakończyła moje tygodnie poszukiwań rozwiązania. Dziękujemy tak dużo! @Redmumba dzięki, Monit wygląda dobrze!
Pryo
Niezależnie od tego, który z nich zdecydujesz zaznaczyć poprawnie, zdecydowanie pozytywnie oceniaj odpowiedź @ gelraen. Jego miejsce na prawidłowe i bardzo pouczające.
Andrew M.,
19

Tylko odpowiedź na część dotyczącą ponownego uruchomienia usługi. Natknąłem się również na Monita, ale na CentOS 7 systemd dba o to wszystko za ciebie. Musisz tylko dodać te dwa wiersze do pliku .service (jeśli jeszcze ich tam nie ma):

Restart=always
RestartSec=3

Zobacz https://jonarcher.info/2015/08/ensure-systemd-services-restart-on-failure/ w celach informacyjnych.

Jeśli chcesz utworzyć niestandardową usługę systemową, bardzo łatwo jest napisać własny plik usługi. Zobacz poniższy przykład niestandardowego serwera HTTP.

Uruchom edytor z nowym plikiem usługi:

vim /etc/systemd/system/httpd.service

I dodaj następującą treść, którą możesz edytować w razie potrzeby:

[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

Chcę, aby uruchamiał się automatycznie podczas rozruchu:

systemctl enable httpd

Poinformuj systemd o zmianach i uruchom usługę:

systemctl daemon-reload
systemctl start httpd

A teraz możesz zobaczyć status:

systemctl status httpd

W celach informacyjnych patrz https://scottlinux.com/2014/12/08/how-to-create-a-systemd-service-in-linux-centos-7/

Nagev
źródło
Tak, dokładnie, systemdstandardowy menedżer usług w większości popularnych dystrybucji może to zrobić za Ciebie.
Rolf
13

Możesz wezwać setsockopt(2)gniazdo nasłuchiwania za pomocą SO_REUSEADDR, abyś mógł do bind(2)niego ponownie, nie czekając na wygaśnięcie wszystkich połączeń. Inna możliwość: porzuć połączenia z jądra. FreeBSD ma tcpdropdo tego polecenie, nie wiem o Linuksie.

gelraen
źródło
4

Jeśli twoja dystrybucja linuksowa używa Upstart zamiast SysV init, respawnsłowo kluczowe to robi.

http://upstart.ubuntu.com/cookbook/#respawn

JeffG
źródło
Dzięki, to wygląda tak, ale niestety utknąłem z init SysV.
Pryo