Jak uruchomić skrypt Pythona w tle i zrestartować go po awarii?

10

Mam bardzo prosty skrypt w języku Python, który chciałbym zawsze uruchamiać na moim serwerze Ubuntu 12.04. Myślałem o użyciu Upstart + Monitor. Problem polega na tym, że te narzędzia wydają się dość skomplikowane dla zwykłego śmiertelnika, takiego jak ja, i nie mogę znaleźć prostego przykładu w Internecie.

Czy overstart + monitor przesada? Czy ktoś zna prostszą alternatywę lub dobry samouczek dla upstart + monitor? Jeśli chcę mieć pewność, że skrypt jest zawsze uruchomiony, czy w ogóle wymagany jest monit?

Sebpiq
źródło
Dla porównania, dokładnie to samo pytanie zostało zadane tutaj: superuser.com/q/461546/786969
PHPirate

Odpowiedzi:

16

Najprostszym sposobem na to jest umieszczenie tego w /etc/init/something.conf:

start on runlevel [2345]
stop on runlevel [016]

respawn
exec python /path/to/your/script.py

Respawn uruchomi go ponownie, jeśli zostanie zabity lub wyjdzie z zera (jak nieprzechwycony wyjątek). To zadziała, wracając do Ubuntu 10.04.

Jeśli masz 12.04, możesz uzyskać więcej fantazji. Powyższe uruchomi twój skrypt jako root. W 12.04 możesz dodać setuid / setgid:

start on runlevel [2345]
stop on runlevel [016]

respawn
setuid nobody
setgid nogroup
exec python /path/to/your/python.py

Jeśli twój skrypt kończy działanie, gdy nie ma dostępnej sieci i planujesz uruchomić go na niestabilnym połączeniu sieciowym, cóż, powinieneś to naprawić i po prostu sprawić, by pozostał przy życiu / spróbuj ponownie. Ale jeśli nie możesz, może być konieczne ręczne uruchomienie go za każdym razem, gdy pojawi się urządzenie sieciowe. Możesz więc umieścić to w /etc/network/if-up.d/yourscript(uczynić to wykonywalnym za pomocą chmod + x)

#!/bin/sh
exec start wait-for-state WAITER=$IFACE-yourscript WAIT_FOR=something

Gdzie twój skrypt jest po prostu czymś arbitralnym i unikalnym dla tego konkretnego skryptu, a „coś” jest takie samo jak nazwa zadania (jak /etc/init/something.confsugerowane wcześniej).

Spamapy
źródło
Tak ! Więc to używa, upstartprawda? Czy to oznacza, że ​​skrypt będzie również uruchamiany przy starcie systemu (co byłoby świetne!)? I respawnwystarczy, aby nie trzeba było konfigurować monit?
sebpiq
Tak, „start na poziomie uruchomieniowym [2345]” oznacza w momencie, gdy system wchodzi w „tryb wielu użytkowników”. W perspektywie długoterminowej powstaje plan zastąpienia bardzo starego uniksowego „poziomu pracy” takimi rzeczami, jak „zacznij od uruchomienia usług sieciowych” i „przestań po zatrzymaniu usług sieciowych”, aby czytał bardziej logicznie.
SpamapS,
Niesamowite ! Wielkie dzięki, właśnie tego potrzebowałem.
sebpiq
2

Tradycyjnym podejściem z dawnych czasów było zapisanie pliku zawierającego znacznik czasu lub identyfikator procesu, /tmpa następnie sprawdzenie, czy ten identyfikator procesu nadal działa lub, odpowiednio, czy znacznik czasu jest wciąż aktualny.

Możesz także zrobić prosty sposób, while [ 1 ]; do phyton-script.ph; donektóry zrestartowałby skrypt w przypadku jego powrotu.

Aby uzyskać więcej możliwości, podaj więcej informacji o skrypcie. Zwłaszcza dlatego, że spodziewasz się niespodziewanego wyjścia lub awarii.

dezorientować
źródło
skrypt po prostu usuwa tweety z Twittera za pomocą interfejsu API przesyłania strumieniowego. Zasadniczo istnieje nieskończona pętla, która czeka na wypchnięcie tweetów, wykonanie kodu i powrót do oczekiwania. Chcę tylko, żeby działało to bez obaw ... jeśli wystąpi błąd i nastąpi awaria, i tak dalej ...
sebpiq
Podobna odpowiedź do twojej (którą zaakceptowałem): superuser.com/questions/461546/…
sebpiq
Dobrym pomysłem może być również zadanie sprawdzania, czy skrypt nadal działa.
con-f-use