Wyszukiwanie w Google ujawnia fragmenty kodu x2. Pierwszym rezultatem jest przepis na ten kod, który zawiera wiele dokumentacji i wyjaśnień, a także kilka przydatnych dyskusji.
Jednak inny przykładowy kod , choć nie zawiera tak dużej dokumentacji, zawiera przykładowy kod do przekazywania poleceń, takich jak start, stop i restart. Tworzy również plik PID, który może być przydatny do sprawdzania, czy demon już działa itp.
Te przykłady wyjaśniają, jak utworzyć demona. Czy są jakieś dodatkowe rzeczy, które należy wziąć pod uwagę? Czy jedna próbka jest lepsza od drugiej i dlaczego?
Odpowiedzi:
Aktualne rozwiązanie
Referencyjna implementacja PEP 3143 (biblioteka procesów demona standardowego) jest teraz dostępna jako demon python .
Odpowiedź historyczna
Próbka kodu Sandera Marechala jest lepsza od oryginału, który został pierwotnie opublikowany w 2004 roku. Kiedyś napisałem demonizator dla Pyro, ale prawdopodobnie użyłbym kodu Sandera, gdybym musiał to zrobić.
źródło
http://pypi.python.org/pypi/python-daemon
. Bardziej wiarygodne. Tylko jeden przykład: spróbuj uruchomić dwa razy tego samego demona zpython-daemon
: dużym brzydkim błędem. Z kodem Sandera: ładny komunikat „Daemon już działa”.quit()
metoda wykonywana przed zatrzymaniem demona. Oto jest.Jest wiele dziwacznych rzeczy, którymi należy się zająć, kiedy zostajesz dobrze zachowanym procesem demona, :
zapobiegaj zrzutom rdzenia (wiele demonów działa jako root, a zrzuty rdzenia mogą zawierać poufne informacje)
zachowuj się poprawnie wewnątrz
chroot
więzieniuustaw UID, GID, katalog roboczy, umask i inne parametry procesu odpowiednio dla przypadku użycia
zrezygnować z podwyższonego
suid
,sgid
przywilejezamknij wszystkie otwarte deskryptory plików, z wykluczeniami zależnymi od przypadku użycia
zachowują się poprawnie, jeśli zostały uruchomione w już odłączonym kontekście, takim jak
init
,inetd
itpskonfiguruj procedury obsługi sygnałów dla rozsądnego zachowania demona, ale także z konkretnymi procedurami obsługi określonymi przez przypadek użycia
przekierować standardowe strumienie
stdin
,stdout
,stderr
ponieważ proces demon nie ma już terminal sterującyobsługiwać plik PID jako blokadę doradczą kooperacji, która sama w sobie jest puszką robaków z wieloma sprzecznymi, ale poprawnymi sposobami zachowania
umożliwiają prawidłowe czyszczenie po zakończeniu procesu
faktycznie stają się procesem demona, nie prowadząc do zombie
Niektóre z nich są standardowe , jak opisano w literaturze kanonicznej Unixa ( Advanced Programming in the UNIX Environment , autorstwa nieżyjącego W. Richarda Stevensa, Addison-Wesley, 1992). Inne, takie jak przekierowanie strumienia i obsługa plików PID , są typowymi zachowaniami większość użytkowników demonów oczekiwałaby, ale są mniej znormalizowane.
Wszystkie są objęte specyfikacją „Standardowa biblioteka procesów demona” PEP 3143 . Python-demon implementacja referencyjna działa na Python 2.7 lub nowsza oraz Python 3.2 lub nowszy.
źródło
Oto mój podstawowy demon Python „Howdy World”, od którego zaczynam, gdy tworzę nową aplikację demona.
Pamiętaj, że będziesz potrzebować
python-daemon
biblioteki. Możesz go zainstalować:Następnie po prostu zacznij od
./howdy.py start
i przestań./howdy.py stop
.źródło
daemon
moduł, który importujesz, nie jest jeszcze standardową częścią Pythona (jeszcze). Musi być zainstalowany zpip install python-daemon
lub równoważny.Zwróć uwagę na demona python pakiet , który rozwiązuje wiele problemów związanych z demonami po wyjęciu z pudełka.
Oprócz innych funkcji umożliwia (z opisu pakietu Debian):
źródło
Alternatywą - stworzyć normalny, nie daemonized programu Pythona następnie zewnętrznie daemonize go za pomocą supervisord . Może to zaoszczędzić wiele problemów i jest przenośne * nix i język.
źródło
Prawdopodobnie nie jest to bezpośrednia odpowiedź na pytanie, ale systemd może służyć do uruchamiania aplikacji jako demona. Oto przykład:
Wolę tę metodę, ponieważ wiele pracy jest dla Ciebie wykonane, a następnie skrypt demona zachowuje się podobnie jak reszta systemu.
-Lub przez
źródło
systemctl start control.service
YapDi to stosunkowo nowy moduł Pythona, który pojawił się w Hacker News. Wygląda całkiem przydatnie, można go użyć do przekonwertowania skryptu Pythona na tryb demona z poziomu skryptu.
źródło
ponieważ python-demon nie obsługuje jeszcze Pythona 3.x iz tego, co można przeczytać na liście mailingowej, może nigdy nie będzie, napisałem nową implementację PEP 3143: pep3143daemon
pep3143daemon powinien obsługiwać co najmniej Python 2.6, 2.7 i 3.x
Zawiera także klasę PidFile.
Biblioteka zależy tylko od biblioteki standardowej i od modułu sześciu.
Może być używany jako kropla zastępująca demona python.
Oto dokumentacja .
źródło
Ta funkcja przekształci aplikację w demona:
źródło
Obawiam się, że moduł demona wspomniany przez @Dustin nie działał dla mnie. Zamiast tego zainstalowałem demona python i użyłem następującego kodu:
Bieganie jest łatwe
dla kompletności tutaj jest zawartość katalogu samplemodule
Zawartość pliku moduleclass.py może być
źródło
Jeszcze jedna rzecz do przemyślenia podczas demonizacji w pythonie:
Jeśli używasz rejestrowania w języku Python i chcesz kontynuować korzystanie z niego po demonizacji, pamiętaj o wywołaniu programów
close()
obsługi (w szczególności programów do obsługi plików).Jeśli tego nie zrobisz, program obsługi może nadal myśleć, że ma otwarte pliki, a twoje wiadomości po prostu znikną - innymi słowy upewnij się, że program rejestrujący wie, że jego pliki są zamknięte!
Zakłada się, że kiedy demonizujesz, zamykasz WSZYSTKIE otwarte deskryptory plików bez rozróżnienia - zamiast tego możesz spróbować zamknąć wszystkie pliki oprócz plików dziennika (ale zwykle łatwiej jest zamknąć wszystkie, a następnie ponownie otworzyć te, które chcesz).
źródło
Chociaż możesz preferować czyste rozwiązanie Python dostarczane przez moduł python-daemon, istnieje
daemon(3)
funkcja wlibc
- przynajmniej na BSD i Linux - która zrobi to dobrze.Wywołanie go z Pythona jest łatwe:
Jedyne, co pozostaje do zrobienia, to utworzenie (i zablokowanie) pliku PID. Ale że sobie poradzisz ...
źródło
Zmodyfikowałem kilka wierszy w przykładzie kodu Sandera Marechala (wspomnianym przez @JeffBauer w zaakceptowanej odpowiedzi ), aby dodać
quit()
metodę, która zostanie wykonana przed zatrzymaniem demona. Czasami jest to bardzo przydatne.Oto jest.
Uwaga: nie używam modułu „python-demon”, ponieważ dokumentacja wciąż brakuje (patrz także wiele innych pytań SO) i jest raczej niejasna (jak poprawnie uruchomić / zatrzymać demona z wiersza poleceń za pomocą tego modułu?)
źródło
Po kilku latach i wielu próbach (wypróbowałem wszystkie podane tutaj odpowiedzi, ale wszystkie miały drobne wady), teraz zdaję sobie sprawę, że istnieje lepszy sposób niż rozpoczęcie, zatrzymanie, zrestartowanie demona bezpośrednio z Pythona : zamiast tego użyj narzędzi systemu operacyjnego.
Na przykład w przypadku systemu Linux zamiast robić
python myapp start
ipython myapp stop
robię to, aby uruchomić aplikację:lub
screen -dmS myapp python myapp.py
do rozpoczęcia i odłączyć go w jednej komendzie .Następnie:
podłączyć ponownie do tego terminala. W terminalu można użyć CTRL + C, aby go zatrzymać.
źródło
Najłatwiejszym sposobem utworzenia demona za pomocą Pythona jest użycie frameworku Twisted sterowanego zdarzeniami. Obsługuje wszystkie rzeczy niezbędne do demonizacji. Używa Wzorca Reaktora do obsługi równoczesnych żądań.
źródło
W 80% przypadków ludzie mówią „demon”, chcą tylko serwera. Ponieważ pytanie w tej kwestii jest całkowicie niejasne, trudno powiedzieć, jaka może być domena odpowiedzi. Ponieważ serwer jest wystarczający, zacznij od tego. Jeśli rzeczywiście potrzebny jest „demon” (jest to rzadki przypadek), czytaj dalej
nohup
przypadek jako sposób na demonizację serwera.Do czasu, gdy rzeczywisty demon jest rzeczywiście wymagany, po prostu napisz prosty serwer.
Zobacz także implementację referencyjną WSGI .
Zobacz także Simple HTTP Server .
„Czy są jakieś dodatkowe rzeczy, które należy wziąć pod uwagę?” Tak. Około miliona rzeczy. Jaki protokół? Ile żądań? Jak długo obsługiwać każde żądanie? Jak często będą przyjeżdżać? Czy zastosujesz dedykowany proces? Wątki Podprocesy? Pisanie demona to duże zadanie.
źródło
fork()
, a co dopiero dwóch. Nie mają one nic wspólnego z demonizacją.crond
lubsyslogd
- czy usługi porządkowe dla całego systemu. Aby utworzyć proces demona, należy przynajmniej wykonać podwójnie -fork()
przy zamkniętych wszystkich deskryptorach plików, aby był odporny na sygnały ze wszystkich kontrolujących terminali, w tym konsoli systemowej. Zobacz odpowiedź bignose.SimpleHTTPServer
jest rzeczywiście serwerem, ale takim, który nie wie natywnie, jak się demonizować (możesz na przykład Ctrl-C).nohup
to narzędzie do demonizacji naiwnego procesu - więc twój niepodłączony serwer jest rzeczywiście zarówno demonem, jak i serwerem, dokładnie tak, jak twierdzisz. Pytanie przepełnienia stosu było w istocie pytaniem: „Jak mogę zaimplementowaćnohup
w Pythonie?”nohup
jest to dobre narzędzie i usunę mój głos -1, jeśli po prostu przeniesiesz ten użyteczny pomysł do swojej rzeczywistej odpowiedzi. W rzeczywistości, jeśli wspomniszsupervisord
i jak to również uratuje autora przed koniecznością rejestrowania, skryptu start-stop i ponownego uruchomienia ograniczania przepustowości, to nawet dam ci +1. :)