2011-09-11 14 views
5

Mam system z wbudowanym systemem linux i ważne jest, aby działał nieprzerwanie. Zasadniczo jest to proces komunikacji z czujnikami i przekazywania tych danych do bazy danych i klienta WWW.Linux automatycznie restartuje aplikację po awarii - Daemons

Jeśli nastąpi awaria, w jaki sposób automatycznie zrestartować aplikację?

Ponadto istnieje kilka wątków wykonujących pobieranie (np. Gniazda & komunikacji UART). Jak mogę się upewnić, że żaden z wątków nie zawiesił się lub nieoczekiwanie zakończył działanie? Czy istnieje łatwy w użyciu watchdog, który jest przyjazny dla użytkownika?

Odpowiedz

6

Istotą jej jest:

  1. Trzeba wykryć, jeśli program nadal działa i nie powiesił.
  2. Musisz (ponownie) uruchomić program, jeśli program nie jest uruchomiony lub zawieszony.

Istnieje wiele różnych sposobów, aby zrobić # 1, ale dwa, które przychodzą do głowy to:

  1. Słuchanie na gniazda UNIX, aby obsługiwać żądania statusu. Zewnętrzna aplikacja może następnie zapytać, czy aplikacja jest nadal w porządku. Jeśli nie otrzyma odpowiedzi w ciągu określonego czasu, można założyć, że aplikacja, której dotyczy zapytanie, zakleszczona lub martwa.

  2. Okresowe dotykanie pliku o wstępnie wybranej ścieżce. Aplikacja zewnętrzna może wyglądać na sygnaturę czasową pliku, a jeśli jest nieaktualna, może założyć, że aplikacja jest martwa lub zakleszczona.

W odniesieniu do # 2, typowe jest zabicie poprzedniego PID i użycie fork + exec do uruchomienia nowego procesu. Możesz także rozważyć zrobienie aplikacji, która działa "w sposób ciągły", w aplikacji uruchamianej raz, ale potem użyj "cron" lub jakiejś innej aplikacji do ciągłego ponownego uruchamiania tej jednorazowej aplikacji.

Niestety, watchdog i wyjście z impasu to nietrywialne problemy. Nie znam żadnego ogólnego sposobu, aby to zrobić, a kilka z nich, które widziałem, jest dość brzydkich, a nie w 100% wolne od błędów. Jednak tsan może pomóc wykryć potencjalne scenariusze zakleszczenia i inne problemy z gwintowaniem przy analizie statycznej.

+0

Każdy z demonów skrzynkowych oglądać demony i ponownie je haha? – user623879

+1

Na wielu platformach wbudowanych możesz kazać swojemu stróżowi podsłuchowemu uruchomić sprzętowy watchdog, zapewniając, że watchdog nie zginie – Hasturkun

+0

Chciałbym dodać sugestię "Dostosuj aplikację tak, aby uruchamiała się tylko raz, a następnie uruchom ponownie uruchamiać aplikację wielokrotnie. " Jeśli jest to możliwe, znacznie uprości to proces wykrywania. –

6

Można bezproblemowo ponownie uruchomić proces, ponieważ umrze z fork i waitpid zgodnie z opisem in this answer. Nie kosztuje żadnych znaczących zasobów, ponieważ system operacyjny będzie udostępniał strony pamięci.

Co pozostawia tylko problem z wykryciem zawieszonego procesu. Możesz skorzystać z któregoś z rozwiązań wskazanych przez Michaela Aarona Safyana, ale jeszcze prostszym rozwiązaniem byłoby wielokrotne używanie układu alarm, z sygnałem kończącym proces (użyj odpowiednio sigaction). Tak długo, jak dzwonisz pod numer alarm (czyli tak długo, jak program jest uruchomiony) będzie on działał dalej. Gdy tego nie zrobisz, sygnał zostanie uruchomiony.
W ten sposób nie są potrzebne żadne dodatkowe programy i używane są jedynie przenośne materiały POSIX.

1

Można by stworzyć CRON pracę aby sprawdzić, czy proces jest uruchomiony z start-stop-daemon od czasu do czasu.

0

wykorzystanie ten skrypt do uruchamiania aplikacji

#!/bin/bash 

while ! /path/to/program #This will wait for the program to exit successfully. 
do 
echo “restarting”     # Else it will restart. 
done 

można również umieścić ten skrypt na swojej /etc/init.d/ w inny zacząć jako demon

Powiązane problemy