Jak nadzorować i automatycznie restartować proces?

34

Chcę mieć proces, który zostanie ponownie uruchomiony, jeśli ulegnie awarii. Poszukałem trochę Google i stwierdziłem, że łatwym rozwiązaniem jest użycie daemontools .

Nie rozumiałem, jak to skonfigurować.

  1. Jaki jest najłatwiejszy sposób na uzyskanie takiej funkcjonalności?
  2. Jak to skonfigurować?
opc0de
źródło

Odpowiedzi:

29

Ta odpowiedź dotyczy wersji Ubuntu z Upstart (<= 14.10). Zastosuj inne podejście do wersji z Systemd (> = 15.04).

Wygląda na to, że szukasz funkcjonalności już dostarczonej w Ubuntu z Upstart . Sekcja respawnw konfiguracji zrobi dokładnie to, czego potrzebujesz. Odradzałbym stosowanie mniej standardowego sposobu radzenia sobie z tym.

Bez dalszych szczegółów na temat procesu, którym próbujesz z nim zarządzać, trudno powiedzieć, jak powinna wyglądać konfiguracja. Zależy to na przykład od tego, czy rozwidla się i umieszcza w tle. Dokumentacja Upstart na respawnzwrotce powinno dać Ci więcej informacji.

Niestety, nie można jeszcze poprawnie uruchomić Zadań użytkownika: nie można rozpocząć pracy z zadaniem użytkownika

Przykład

Załóżmy, że chcemy utrzymać działanie aplikacji Kalkulator, nawet gdy zostanie ona zabita ogniem (sygnał 9).

  1. Utwórz plik konfiguracyjny w /etc/init/calculator.conf(na podstawie tego artykułu ):

    #!upstart
    description "Calculator"
    
    # Start job via the daemon control script. Replace "gert" with your username.
    exec su -l gert -c 'export DISPLAY=:0; /usr/bin/gnome-calculator'
    
    # Restart the process if it dies with a signal
    # or exit code not given by the 'normal exit' stanza.
    respawn
    
    # Give up if restart occurs 10 times in 90 seconds.
    respawn limit 10 90
    
  2. Zacznij od uruchomienia

    sudo start calculator
    
  3. Otwiera się na twoim bieżącym wyświetlaczu ( :0) i ciesz się niesamowitością, widząc, jak restartuje się po zamknięciu.

    • Zidentyfikuj identyfikator procesu, np. Wykonując ps aux | grep calculator:

      gert  13695 0.2 0.4 349744 16460 ?   Sl   13:38   0:00 /usr/bin/gnome-calculator
      
    • Zabij to ogniem.

      sudo kill -9 13695
      
    • Zobacz, jak się pojawia:

      gert  16059 4.6 0.4 349736 16448 ?   Sl   13:40   0:00 /usr/bin/gnome-calculator
      

Pamiętaj, że będzie to bardziej eleganckie dzięki planom Ubuntu 13.04 z odpowiednim wsparciem dla Job User.

gertvdijk
źródło
Dostaję nieznaną pracę, kiedy próbuję ją uruchomić? jakakolwiek ideea. umieściłem plik w / etc / init
opc0de
@ opc0de Nazwa pliku servicename.confmusi być zgodna z poleceniem, aby rozpocząć start servicename. Podejrzewam, że wybrałeś inne imię.
gertvdijk
nie, pasuje, ale nie poszedłem za twoim przykładem, więc myślę, że mogę mieć błąd składniowy.
opc0de
@ opc0de Cóż, zacznij od wyjaśnienia więcej o tym, co próbujesz osiągnąć w pytaniu: jaki rodzaj aplikacji / procesu i jak na przykład go uruchamiasz, a także szczegóły dotyczące bieżącej próby.
gertvdijk
Rozwiązałem na twoim przykładzie mój błąd polegał na tym, że prawdopodobnie popełniłem błąd w statucie exec. Dzięki za pomoc!
opc0de
13

Niezwykle prostym narzędziem, które może osiągnąć ten sam efekt bez potrzeby konfiguracji, jest immortal: https://immortal.run/

Po prostu wykonaj polecenie w następujący sposób:

immortal <cmd>

Będzie działał w tle i uruchomi się automatycznie, jeśli wyjdzie.

  • immortalctl: Wyświetl status uruchomionych zadań. Jest to namekolumna, która zostanie wydrukowany tutaj, można to wykorzystać, aby odnieść się do pracy z innych komend sterujących.
  • immortalctl stop <name>: Zatrzymuje monitorowanie zadania o podanej nazwie (nie zostanie ono automatycznie uruchomione ponownie, ale bieżący proces będzie kontynuowany)
  • immortalctl -k <name>: Wysyła SIGKILL do bieżącego procesu.
  • immortalctl exit <name>: Zatrzymuje monitorowanie zadania o podanej nazwie i usuwa je z listy zadań.
silnik zewnętrzny
źródło
1
Dzięki, działało to świetnie w moim przypadku użycia w 16.04. Wkładam to do mojej torby przydatnych narzędzi.
Quentin Skousen
2
Rzeczywiście, wygląda to na nieco lżejsze niż upstart / respawn.
Sridhar Sarnobat
Czy istnieje sposób, aby zmusić go do wyświetlania stdouti stderrna pierwszym planie?
David S.
Nie znam go, ponieważ zwykle służy do uruchamiania procesu w tle. Możesz jednak użyć immortalctl -l out.log <cmd> && tail -f out.logtego samego efektu.
silnik pozagiełdowy
@DavidS. możesz uzyskać połączony dziennik lub mieć stdout i stderr immortal.run/post/stderr
nbari 11.11.17
1

Jeśli nie potrzebujesz funkcji demona / usługi / procesu w tle i po prostu chcesz to zrobić w konsoli, utwórz plik o nazwie autorestart.sh:

#!/bin/bash

while [ 1 ]; do
  some_command
done

Następnie ./autorestart.shautomatycznie uruchomi się ponownie, some_commandjeśli wyjdzie lub ulegnie awarii. CTRL-C przerywa pętlę i porządnie zamyka program.

Testowane na Ubuntu 18.04.

Jan Święcki
źródło
0

Jest sposób bez „Upstart”. Słowo kluczowe to „inittab” :-). Mimo że jest to plik zwykle niezmieniony od domyślnego, można go użyć do osiągnięcia pożądanego odrodzenia na komputerach SYSV.

cepal67
źródło
Nie rozumiem, dlaczego ktoś ODRZUCIŁ to rozwiązanie. Jeśli tego nie rozumiesz, po prostu google; nie ma sensu wycinać i wklejać tutaj stron podręcznika initttab, możesz je przeczytać sam w swoim systemie! po prostu wpisz „man inittab” ...
cepal67
13
Wysokiej jakości odpowiedzi szczegółowo bardziej niż „skorzystaj z tego, wymyśl to sam” :)
Seth
0

ps-watcher to narzędzie, które obserwuje, które procesy są uruchomione i wykonuje akcję w określonych okolicznościach. Zainstalujmy to:

apt-get install ps-watcher

Szczegółowe informacje można znaleźć w dolnej części Uruchamianie HHVM z powrotem do PHP-FPM - to zadziałało dla mnie dobrze.

Firegarden
źródło
Ponieważ nie jest on zbyt długi, proszę dodać streszczenie kodu zamiast artykułu, ponieważ tylko bardzo krótka sekcja dotyczy tego pytania.
derHugo,
0

Procesami uruchamiania i odradzania zarządza „systemd” od Ubuntu 15.04, dobre wprowadzenie można znaleźć tutaj

https://www.digitalocean.com/community/tutorials/systemd-essentials-working-with-services-units-and-the-journal

przykład, od którego możesz zacząć, jest dostępny na

https://www.devdungeon.com/content/creating-systemd-service-files

To podejście zastępuje starsze oparte na / etc / inittab i upstart.

Nikolaus Correll
źródło