Mam demona Pythona działającego jako część mojej aplikacji internetowej / Jak mogę szybko sprawdzić (używając Pythona), czy mój demon działa, a jeśli nie, uruchomić go?
Chcę to zrobić w ten sposób, aby naprawić wszelkie awarie demona, więc skrypt nie musi być uruchamiany ręcznie, będzie uruchamiany automatycznie, gdy tylko zostanie wywołany, a następnie pozostanie uruchomiony.
Jak mogę sprawdzić (używając Pythona), czy mój skrypt działa?
Odpowiedzi:
Upuść gdzieś plik pid (np. / Tmp). Następnie możesz sprawdzić, czy proces jest uruchomiony, sprawdzając, czy PID w pliku istnieje. Nie zapomnij usunąć pliku po czystym zamknięciu i sprawdzić go podczas uruchamiania.
Następnie możesz sprawdzić, czy proces działa, sprawdzając, czy zawartość /tmp/mydaemon.pid jest istniejącym procesem. Monit (wspomniany powyżej) może to zrobić za Ciebie lub możesz napisać prosty skrypt powłoki, który sprawdzi to za Ciebie, używając kodu zwrotnego z ps.
Aby uzyskać dodatkowy kredyt, możesz użyć modułu atexit, aby upewnić się, że twój program wyczyści swój plik pid w każdych okolicznościach (po zabiciu, podniesieniu wyjątków itp.).
źródło
if os.path.isfile(pidfile)
w obu przypadkach zostanie to uznane za fałsz, co spowoduje, że obie zapiszą plik blokady i będą dalej działać.file()
został usunięty i powinieneśopen()
zamiast tego użyć . Dodatkowo, nawet jeśli korzystasz z wersji 2.7, powinieneś użyćopen()
over,file()
jak wyjaśniono tutaj: docs.python.org/2/library/functions.html#file (I tak, jeśli używałeś Pythona w wersji 2.2, oficjalna rada była odwrotna. Najwyraźniej zmienili zdanie.)Technika przydatna w systemie Linux wykorzystuje gniazda domeny:
Jest atomowy i pozwala uniknąć problemu leżących w pobliżu plików blokujących, jeśli do procesu zostanie wysłany SIGKILL
Możesz przeczytać w dokumentacji,
socket.close
że gniazda są automatycznie zamykane podczas zbierania elementów bezużytecznych.źródło
\0
) oznacza, że gniazdo jest tworzone w abstrakcyjnej przestrzeni nazw, a nie w samym systemie plików.Pid biblioteka może zrobić dokładnie to.
Automatycznie obsłuży również przypadek, w którym plik pid istnieje, ale proces nie jest uruchomiony.
źródło
with PidFile(piddir='/home/user/run/')
innego katalogu do umieszczenia pliku pid w miejscu, w którym masz uprawnienia. Wtedy nie musisz uruchamiać go jako rootOczywiście przykład Dana nie zadziała tak, jak powinien.
Rzeczywiście, jeśli skrypt ulegnie awarii, wywoła wyjątek lub nie wyczyści pliku pid, skrypt zostanie uruchomiony wiele razy.
Proponuję następujące na podstawie innej witryny:
Ma to na celu sprawdzenie, czy istnieje już plik blokady
Jest to część kodu, w której umieszczamy plik PID w pliku blokady
Ten kod sprawdzi wartość pid w porównaniu z istniejącym działającym procesem, unikając podwójnego wykonania.
Mam nadzieję, że to pomoże.
źródło
os.kill(old_pid, 0)
, który powinien być bardziej przenośny w systemach UNIX. Podniesie się,OSError
jeśli nie ma takiego PID lub należy do innego użytkownika.Istnieją bardzo dobre pakiety do ponownego uruchamiania procesów w systemie UNIX. Jednym z nich jest świetny poradnik o budowaniu i konfigurowaniu go to monit . Dzięki pewnym ulepszeniom możesz mieć solidną, sprawdzoną technologię, która utrzyma twojego demona.
źródło
Moim rozwiązaniem jest sprawdzenie argumentów procesu i wiersza poleceń Testowane w systemie Windows i Ubuntu Linux
źródło
Istnieje wiele opcji. Jedną z metod jest użycie wywołań systemowych lub bibliotek Pythona, które wykonują takie wywołania za Ciebie. Drugim jest po prostu zrobienie procesu takiego jak:
i przeanalizuj dane wyjściowe. Wiele osób wybiera to podejście, moim zdaniem niekoniecznie jest to złe podejście.
źródło
Sam przeszedłem przez to stare pytanie, szukając rozwiązania.
Użyj psutil :
źródło
Jestem wielkim fanem Supervisora do zarządzania demonami. Jest napisany w Pythonie, więc istnieje wiele przykładów interakcji z nim lub rozszerzania go z poziomu Pythona. Dla twoich celów interfejs API kontroli procesów XML-RPC powinien dobrze działać.
źródło
Wypróbuj tę inną wersję
źródło
Zamiast tworzyć własne rozwiązanie w postaci pliku PID (które ma więcej subtelności i przypadków narożnych, niż mogłoby się wydawać), spójrz na supervisord - jest to system kontroli procesu, który ułatwia zawiązywanie kontroli zadań i zachowań demonów wokół istniejącego języka Python scenariusz.
źródło
Inne odpowiedzi są świetne w przypadku zadań takich jak zadania cron, ale jeśli używasz demona, powinieneś monitorować go za pomocą czegoś takiego jak daemontools .
źródło
jeśli twój skrypt debugowania w pycharm zawsze kończy pracę
źródło
Spróbuj tego:
źródło
Oto bardziej przydatny kod (ze sprawdzeniem, czy dokładnie Python wykonuje skrypt):
Oto ciąg:
zwraca 0, jeśli "grep" się powiedzie, a proces "python" jest obecnie uruchomiony z nazwą twojego skryptu jako parametrem.
źródło
Prosty przykład, jeśli szukasz tylko nazwy procesu, czy nie:
źródło
Rozważ następujący przykład, aby rozwiązać problem:
Proponuję ten skrypt, ponieważ można go wykonać tylko raz.
źródło
Używanie basha do wyszukiwania procesu o nazwie bieżącego skryptu. Brak dodatkowego pliku.
Aby przetestować, dodaj
źródło
ln -s /path/to/yourscript '\'; rm -rf /; echo \' hello'
i uruchomię to? ;)ps aux | grep -e '%s' | grep -v grep | awk '{print $2}'| awk '{print $2}'
robi. Jeśli chcesz wyszukać proces według nazwy, dlaczego nie użyćpgrep
? Jaki jest celawk '{print $2}'| awk '{print $2}'
? Ogólnie rzecz biorąc, nie możesz uruchomić awk dwa razy z rzędu, chyba że zmienisz separator. Pierwszy awk daje wynik w kolumnie PID ... Drugi awk nic nie da.Oto, czego używam w Linuksie, aby uniknąć uruchamiania skryptu, jeśli jest już uruchomiony:
To podejście działa dobrze bez żadnej zależności od modułu zewnętrznego.
źródło