Korzystam z mojego skryptu Python w tle na moim komputerze Ubuntu (12.04) w ten sposób -
nohup python testing.py > test.out &
Możliwe, że na pewnym etapie moje powyżej Python script
mogą umrzeć z jakiegokolwiek powodu.
Więc myślę, że mam coś takiego cron agent
skrypt powłoki bash, który może automatycznie zrestartować mój powyższy skrypt Pythona, jeśli zostanie zabity z jakiegokolwiek powodu.
Czy to się da zrobić? Jeśli tak, to jaki jest najlepszy sposób rozwiązania tego rodzaju problemu?
AKTUALIZACJA:
Po utworzeniu takiego testing.conf
pliku -
chdir /tekooz
exec python testing.py
respawn
Uruchomiłem poniżej polecenia sudo, aby go uruchomić, ale nie widzę, że ten proces działa za pomocą ps ax?
root@bx13:/bezook# sudo start testing
testing start/running, process 27794
root@bx13:/bezook# ps ax | grep testing.py
27806 pts/3 S+ 0:00 grep --color=auto testing.py
Masz pojęcie, dlaczego px ax nic mi nie pokazuje? Jak mogę sprawdzić, czy mój program działa, czy nie?
To jest mój skrypt Pythona -
#!/usr/bin/python
while True:
print "Hello World"
time.sleep(5)
/etc/init
pliku? Jeśli możesz podać mi przewodnik krok po kroku, będę mógł się czegoś nauczyć i zrobić właściwą rzecz.sys.stdout = open(file_name, 'w')
na początku coś takiego .px ax | grep testing.py
.. Nic mi nie zwraca? Masz pomysł, dlaczego?Możesz także zastosować podejście bardziej zorientowane na powłokę. Mieć swój
cron
wygląd skryptu i wznowienia go, jeśli obumrze.Utwórz nowy plik crontab, uruchamiając
crontab -e
. Spowoduje to wyświetlenie okna Twojego ulubionego edytora tekstu.Dodaj ten wiersz do właśnie otwartego pliku
Zapisz plik i zamknij edytor.
Właśnie utworzyłeś nowy,
crontab
który będzie uruchamiany co 5 minut i uruchom skrypt, chyba że jest już uruchomiony. Zobacz tutaj, aby uzyskać ładny mały samouczek na tematcron
. Oficjalne dokumenty Ubuntucron
są tutaj .Rzeczywiste uruchamiane polecenie
pgrep
wyszukuje w uruchomionych procesach ciąg podany w wierszu polecenia.pgrep foo
wyszuka program o nazwiefoo
i zwróci jego identyfikator procesu .pgrep -f
sprawia, że przeszukuje cały wiersz poleceń użyty do uruchomienia programu, a nie tylko nazwę programu (przydatne, ponieważ jest to skrypt w języku Python).Te
||
środki symbol „to zrobić, jeśli poprzednie polecenie nie powiodło się”. Tak więc, jeśli skrypt nie działa,pgrep
nie powiedzie się, ponieważ nic nie znajdzie, a skrypt zostanie uruchomiony.źródło
crontab -e
z katalogu, w którym znajduje się mój skrypt Python ..cron
jest demonem planowania, to usługa działająca w tle. Jeśli twojego skryptu python nie ma w twoim$PATH
(jeśli nie możesz go uruchomić z dowolnego miejsca, ale musisz znajdować się w jego katalogu), użyj pełnej ścieżki do skryptu, jak w mojej zaktualizowanej odpowiedzi.Program testowy może przekierować dane wyjściowe za pomocą opcji wiersza polecenia, a następnie użyć prostego skryptu python, aby ponownie uruchomić program na czas nieokreślony:
możesz umieścić ten program w tle, a gdy chcesz przestać, po prostu wyciągnij go na pierwszy plan i zabij.
źródło
Tak naprawdę nie powinieneś tego używać do produkcji, ale możesz:
Jeśli z jakiegoś powodu proces Pythona zostanie zamknięty, pętla powłoki będzie kontynuowana i uruchomi ją ponownie, dołączając do
.out
pliku zgodnie z potrzebami. Prawie brak kosztów ogólnych i zajmuje bardzo mało czasu.źródło
Istnieje wiele sposobów monitorowania i odradzania procesów w systemie UNIX / Linux. Jednym z najstarszych jest wpis „respawn” w / etc / inittab ... jeśli używasz starego systemu inicjującego SysV. Inną metodą jest użycie demona nadzorcy z pakietu daemontools DJ Bernsteina . Inne opcje to użycie funkcji w Ubuntu upstart ... lub systemd lub innych.
Ale możesz spojrzeć na alternatywę init i kod Pythona dla Pardus: w szczególności demona mudur .
Jeśli zdecydujesz się na zadanie cron (i obsługę plików PID), rozważ przeczytanie tego PEP 3143 i być może skorzystanie z jego referencyjnej implementacji.
Jak wspomniałem w innych komentarzach, solidna obsługa plików PID jest trudna. Jest podatny na wyścigi i walizki narożne. Staje się trudniejsze, jeśli istnieje szansa, że plik PID znajdzie się w systemie plików NFS lub innym sieciowym systemie plików (pewna atomowość gwarantuje, że otrzymujesz semantykę obsługi plików w odpowiednich lokalnych systemach plików UNIX / Linux w niektórych wersjach i implementacjach NFS, na przykład). Również semantyka wokół blokowania plików w systemie UNIX może być trudna. (Czy blokada
flock
lubfcntl
blokada jest natychmiast zwalniana w docelowym systemie operacyjnym, gdy na przykład proces trzymający ją zostaje zabity przez SIGKILL?).źródło
Można również użyć Monit Or proces monitorowania z ps-Watcher
Oto przykład twojego scenariusza:
Spójrz na przykłady monitorów
źródło
Potrzebujesz przełożonego, którego możesz użyć przełożonego . Jest to superwizor oparty na pythonie, dlatego w razie potrzeby można go łatwo modyfikować.
Sterowanie odbywa się za pomocą plików o składni pliku .ini.
źródło
Odpowiedź Terdona nie działała dla mnie, ponieważ
pgrep -f testing.py
nigdy nie „ zawodziła ”. Pobierałby pid dla zadania cron (z powodu opcji -f). Jednak bez opcji -f pgrep nie znajdzie test.py, ponieważ nie ma procesu o nazwie testing.py.Moim rozwiązaniem tego było zmienić
do
oznacza to, że pełna praca crontab to:
źródło
W moim przypadku, jako szybką poprawkę, chciałem, aby mój program działał, gdy zakończył działanie z błędem lub został zabity. Z drugiej strony chciałem zatrzymać wykonywanie, gdy program zakończy się poprawnie (kod powrotu = 0)
Przetestowałem to na Bash. Powinien działać dobrze w każdej innej powłoce
źródło
Dla odpowiedzi terdona,
pgrep -f testing.py
nigdy nie zwróci fałszu zgodnie z komentarzami tutaj :Bo odpowiedź Matta
pgrep -f testing.py
jest bezużytecznapgrep python
pasuje do dowolnego działającego skryptu Python. Więc jeśli dwa cronjob ze skryptem Python, drugi cronjob nigdy się nie uruchomi.A potem znalazłem rozwiązanie do rozwiązania
pgrep -f testing.py
w komentarzu tutaj: https://askubuntu.com/questions/1014559/running-pgrep-in-a-crontab?noredirect=1&lq=1Mój cron do uruchamiania dwóch skryptów Python:
źródło