Mam proces wykonywany przez skrypt init.d w tle. Na przykład:
case "$1" in
start)
/bin/myprocess &
stop)
killall myprocess
restart)
killall myprocess
/bin/myprocess &
esac
W pewnych warunkach mój proces może zakończyć się niepowodzeniem i powrócić. Czy jest jakiś (standardowy) sposób na wykrycie awarii i ponowne uruchomienie automatyczne?
Odpowiedzi:
Najprostszym sposobem byłoby dodanie go do pliku / etc / inittab , który został zaprojektowany do tego typu czynności:
Na przykład możesz to zrobić:
źródło
/etc/inittab
działa (lub nawet istnieje) tylko wtedy, gdy masz system inicjujący oparty na sysvinit. Z upstart i z systemd tak nie jest. Musisz zainstalować busyboksa (bardzo prymitywną powłokę powodującą, że sysadm odzyskuje zadania bolesne, ale może zastąpić initd kompatybilny z sysvinit) lub sysvinit (jest to skamielina). W pojemniku dokowanym tylko pierwszy nie jest bolesny.Buildroot ma trzy możliwe systemy inicjujące, więc można to zrobić na trzy sposoby:
BusyBox
init
Dzięki temu dodaje się wpis do
/etc/inittab
.Zauważ, że BusyBox
init
ma idiosynkratyczny/etc/inittab
format. Drugie pole jest bez znaczenia, a pierwsze pole nie jest identyfikatorem, ale nazwą urządzenia.Linux „System V”
init
Ponownie dodaje się wpis do
/etc/inittab
.systemd
Jeden zapisuje plik jednostkowy, powiedzmy
/etc/systemd/system/myprocess.service
:Włącz tę opcję, aby automatycznie uruchamiać się podczas uruchamiania za pomocą:
Uruchom ręcznie za pomocą:
Dalsza lektura
źródło
service mything start
czyservice mything stop
jest sposób, aby mieć to, co najlepsze? tzn. niezniszczalna usługa sysvinit, ale czy można ją również wykorzystać za pomocą „usługi”?A co z tworzeniem podpowłoki z pętlą, która wywołuje ciągle ten sam proces?
Jeśli się skończy, następna iteracja pętli rozpocznie się i rozpocznie ją ponownie.
Jeśli podpowłoka umrze, to jednak koniec. Jedyną możliwością w tym przypadku byłoby stworzenie innego procesu (nazywam to nekromantą), który sprawdza, czy twój proces żyje, uruchom go, jeśli tak nie jest, i uruchom tego nekromanty za pomocą crona, abyś mógł to regularnie sprawdzać.
Następnym krokiem byłoby zastanowienie się, co by się stało, gdyby umarł cron, ale w pewnym momencie powinieneś czuć się bezpiecznie i przestać się martwić.
źródło
Możesz skorzystać z Monit . Jest naprawdę łatwy w użyciu i dość elastyczny. Zobacz na przykład tę konfigurację dotyczącą ponownego uruchamiania procesu Tomcat po awarii.
Zawiera również wiele przykładów konfiguracji dla wielu przypadków użycia.
źródło
Jeśli nie jesteś superużytkownikiem lub rootem, a jeśli w systemie Linux jest zainstalowany Docker, możesz utworzyć obraz dokera swojego procesu, używając go do zrestartowania procesu, jeśli system zostanie zrestartowany.
Plik: docker-compose.yml
Aby uruchomić kontener dokerów,
Uważam, że łatwo jest obsługiwać mój własny proces z automatycznym ponownym uruchomieniem, jeśli nie jestem super użytkownikiem systemu.
Oto przykład szybkiego tworzenia obrazu dokera:
Plik: Plik Docker
źródło
W moim przypadku jako szybką poprawkę zmodyfikowałem i użyłem rozwiązania @Trylks, aby owinąć uruchamiany program. Chciałem, żeby zakończyło się to dopiero przy czystym wyjściu.
Powinien działać w większości powłok:
źródło
Możesz użyć restarter
W nowszych systemach użyj systemd, który rozwiązuje wszystkie te trywialne problemy
źródło