Napisałem skrypt w Pythonie, który sprawdza określony adres e-mail i przekazuje nowe wiadomości e-mail do zewnętrznego programu. Jak mogę sprawić, aby ten skrypt działał 24 godziny na dobę, 7 dni w tygodniu, na przykład zamieniając go w demona lub usługę w systemie Linux. Czy potrzebowałbym również pętli, która nigdy nie kończy się w programie, czy można to zrobić, po prostu wykonując kod wielokrotnie ponownie?
175
systemd
, możesz utworzyć usługę systemową wdaemon
trybie opisanym tutaj . Zobacz też: freedesktop.org/software/systemd/man/systemd.service.htmlOdpowiedzi:
Masz dwie możliwości.
Wykonaj odpowiednie zadanie cron, które wywoła twój skrypt. Cron to popularna nazwa demona GNU / Linux, który okresowo uruchamia skrypty zgodnie z ustalonym harmonogramem. Dodajesz swój skrypt do crontab lub umieszczasz do niego dowiązanie symboliczne do specjalnego katalogu, a demon wykonuje zadanie uruchomienia go w tle. Możesz przeczytać więcej na Wikipedii. Istnieje wiele różnych demonów cron, ale Twój system GNU / Linux powinien mieć je już zainstalowane.
Użyj jakiegoś podejścia w Pythonie (na przykład biblioteki), aby twój skrypt mógł się zdemonizować. Tak, będzie to wymagało prostej pętli zdarzeń (gdzie zdarzenia są wyzwalane przez timer, być może zapewnione przez funkcję uśpienia).
Nie radziłbym ci wybierać 2., ponieważ w rzeczywistości powtarzałbyś funkcjonalność crona. Paradygmat systemu Linux polega na umożliwieniu współdziałania wielu prostych narzędzi i rozwiązywania problemów. Jeśli nie ma dodatkowych powodów, dla których powinieneś tworzyć demona (oprócz okresowego uruchamiania), wybierz inne podejście.
Ponadto, jeśli użyjesz demonizacji z pętlą i nastąpi awaria, nikt nie będzie sprawdzał poczty później (jak wskazał Ivan Nevostruev w komentarzach do tej odpowiedzi). Jeśli skrypt zostanie dodany jako zadanie cron, po prostu uruchomi się ponownie.
źródło
crontab
liście? Jeśli skonfiguruję taki.py
na godzinę, czy utworzy wiele procesów, które nigdy nie zostaną zakończone? Jeśli tak, myślę, że to całkiem spodobałoby się demonowi.Oto fajna klasa, która została wzięta stąd :
źródło
Powinieneś użyć biblioteki python-daemon , ona dba o wszystko.
Z PyPI: Library, aby zaimplementować dobrze działający proces demona Unix.
źródło
Możesz użyć fork (), aby odłączyć swój skrypt od terminala i kontynuować jego działanie, na przykład:
Oczywiście musisz również zaimplementować nieskończoną pętlę, na przykład
Mam nadzieję, że to się zaczęło.
źródło
nohup
/disown
commands odłączy proces od konsoli i nie umrze. Lub możesz zacząć odMożesz również uruchomić skrypt Pythona jako usługę za pomocą skryptu powłoki. Najpierw utwórz skrypt powłoki, aby uruchomić skrypt Pythona w ten sposób (dowolna nazwa skryptu)
teraz utwórz plik w /etc/init.d/scriptname
Teraz możesz uruchomić i zatrzymać skrypt Pythona za pomocą polecenia /etc/init.d/scriptname start lub stop.
źródło
Prosta i obsługiwana wersja to
Daemonize
.Zainstaluj go z Python Package Index (PyPI):
a następnie użyj:
źródło
cron
jest z pewnością doskonałym wyborem do wielu celów. Jednak nie tworzy usługi ani demona, jak zażądałeś w OP.cron
po prostu uruchamia zadania okresowo (co oznacza, że zadanie jest uruchamiane i zatrzymywane) i nie częściej niż raz na minutę. Występują problemycron
- na przykład, jeśli poprzednia instancja skryptu nadal działa, gdy następnym razemcron
pojawi się harmonogram i uruchomi nową instancję, czy to w porządku?cron
nie obsługuje zależności; po prostu próbuje rozpocząć pracę, gdy nakazuje to harmonogram.Jeśli znajdziesz sytuację, w której naprawdę potrzebujesz demona (procesu, który nigdy nie przestaje działać), spójrz na
supervisord
. Zapewnia prosty sposób na opakowanie normalnego, nie demonizowanego przez demona skryptu lub programu i sprawienie, aby działał jak demon. To znacznie lepszy sposób niż tworzenie natywnego demona Pythona.źródło
co powiesz na użycie
$nohup
polecenia w systemie Linux?Używam go do uruchamiania poleceń na moim serwerze Bluehost.
Proszę o poradę, jeśli się mylę.
źródło
Jeśli używasz terminala (ssh lub czegoś podobnego) i chcesz, aby skrypt działał przez długi czas po wylogowaniu się z terminala, możesz spróbować tego:
screen
apt-get install screen
utwórz wirtualny terminal wewnątrz (a mianowicie abc):
screen -dmS abc
teraz łączymy się z abc:
screen -r abc
Więc teraz możemy uruchomić skrypt w Pythonie:
python keep_sending_mails.py
od teraz możesz bezpośrednio zamknąć terminal, jednak skrypt Pythona będzie działał, a nie zostanie zamknięty
Jeśli chcesz wrócić, sprawdź stan działania skryptu, możesz użyć
screen -r abc
ponownieźródło
Najpierw przeczytaj aliasy poczty. Alias pocztowy zrobi to wewnątrz systemu pocztowego bez konieczności wygłupywania się z demonami, usługami lub czymkolwiek w tym rodzaju.
Możesz napisać prosty skrypt, który będzie wykonywany przez sendmail za każdym razem, gdy wiadomość zostanie wysłana do określonej skrzynki pocztowej.
Zobacz http://www.feep.net/sendmail/tutorial/intro/aliases.html
Jeśli naprawdę chcesz napisać niepotrzebnie złożony serwer, możesz to zrobić.
To wszystko, czego potrzeba. Twój skrypt po prostu zapętla się i śpi.
źródło
do_the_work()
może zawiesić skrypt i nikt go nie uruchomitry
część zawodzi iexcept:
część zostanie wywołana zamiast tego (w tym przypadku nic), ale pętla będzie kontynuowana i będzie próbowała wywołać funkcję.Zakładając, że naprawdę chciałbyś, aby Twoja pętla działała 24/7 jako usługa w tle
W przypadku rozwiązania, które nie obejmuje wstrzykiwania kodu za pomocą bibliotek, możesz po prostu utworzyć szablon usługi, ponieważ używasz systemu Linux:
Umieść ten plik w folderze usługi demona (zwykle
/etc/systemd/system/
) i zainstaluj go za pomocą następujących poleceń systemctl (prawdopodobnie będzie wymagać uprawnień sudo):Następnie możesz sprawdzić, czy Twoja usługa działa, używając polecenia:
źródło
Poleciłbym to rozwiązanie. Musisz dziedziczyć i przesłonić metodę
run
.źródło
aby stworzyć coś, co działa jak usługa, możesz użyć tego:
Pierwszą rzeczą, którą musisz zrobić, jest zainstalowanie frameworka Cement : szkielet Cement to szkielet interfejsu CLI, na którym można wdrożyć aplikację.
interfejs wiersza poleceń aplikacji:
interface.py
Klasa YourApp.py:
Pamiętaj, że aby aplikacja była demonem, musi działać w wątku
Aby uruchomić aplikację, zrób to w linii poleceń
źródło
Użyj dowolnego menedżera usług, który oferuje twój system - na przykład w systemie Ubuntu użyj upstart . Spowoduje to obsługę wszystkich szczegółów, takich jak uruchamianie podczas rozruchu, ponowne uruchamianie w przypadku awarii itp.
źródło