Istotą jej jest:
- Trzeba wykryć, jeśli program nadal działa i nie powiesił.
- 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:
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.
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.
Każdy z demonów skrzynkowych oglądać demony i ponownie je haha? – user623879
Na wielu platformach wbudowanych możesz kazać swojemu stróżowi podsłuchowemu uruchomić sprzętowy watchdog, zapewniając, że watchdog nie zginie – Hasturkun
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. –