Prosty sposób na ponowne uruchomienie zawieszonych procesów?

10

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!

Lin
źródło
nie mogę uwierzyć, jak trudne były takie rzeczy w czasach przedsystematycznych.
Fl0v0

Odpowiedzi:

17

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.

Ian Clelland
źródło
Używam również daemontools do monitorowania procesów niestabilnych usług. Całkiem przydatne, gdybym musiał powiedzieć. :-)
edomaur,
2

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.

Kyle Brandt
źródło
Początkowo zastanawiałem się nad Nagios, ale chciałem czegoś małego i prostego do moich celów. I tak, analizuję kwestię lakieru. Jeden z moich serwerów działa stabilnie od bardzo dawna, więc na pewno ma to coś wspólnego ze mną. :(
Lin
1

Kolejna świetna metoda zaczerpnięta z StackOverflow :

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

Można to dodać do crontab:

crontab -e

Następnie dodaj regułę, aby uruchomić skrypt monitorowania:

@reboot /usr/local/bin/myservermonitor

Lub dodany jako skrypt w /etc/init.d

Zobacz odpowiedź StackOverflow, aby uzyskać szczegółowe wyjaśnienie, dlaczego jest to dobre podejście.

Cory Klein
źródło
0

Szukałem również najprostszego sposobu rozwiązania tego problemu. Najprostszym sposobem, jaki mogłem znaleźć, jest po prostu dodać Restart=allwaysdo odpowiedniego .servicepliku w /etc/systemd/system/multi-user.target.wants/ostatnim wierszu [service]tagu.

Następnie wykonaj sudo systemctl daemon-reloadnastępujące czynności, sudo systemctl restart service.serviceaby ponownie załadować zmiany.

Możesz przetestować, sprawdzając, czy usługa jest uruchomiona: systemctl status processnamesprawdź znacznik czasu rozpoczęcia. Po tym ps -ef | grep servicename, reklama zabije proces z właśnie znalezionym identyfikatorem kill 1234. potem zrób to systemctl status processnamejeszcze raz i sprawdź, czy znacznik czasu rozpoczęcia jest zaktualizowany.

Powinien działać na:

  • Debian 7 i Debian 8
  • Ubuntu 15.04 i nowsze
  • CentOS 7 i przyszłościowe
RoDo
źródło