Ich habe ein Python-Skript geschrieben, das eine bestimmte E-Mail-Adresse überprüft und neue E-Mails an ein externes Programm weiterleitet. Wie kann ich dieses Skript rund um die Uhr ausführen lassen, z. B. um es in einen Daemon oder einen Dienst unter Linux umzuwandeln? Würde ich auch eine Schleife benötigen, die niemals im Programm endet, oder kann dies durch mehrmaliges Ausführen des Codes erfolgen?
175
systemd
können Sie einen systemd-Dienst im hierdaemon
beschriebenen Modus erstellen . Siehe auch: freedesktop.org/software/systemd/man/systemd.service.htmlAntworten:
Sie haben hier zwei Möglichkeiten.
Machen Sie einen richtigen Cron-Job , der Ihr Skript aufruft. Cron ist ein gebräuchlicher Name für einen GNU / Linux-Daemon, der regelmäßig Skripte nach einem von Ihnen festgelegten Zeitplan startet. Sie fügen Ihr Skript einer Crontab hinzu oder platzieren einen Symlink dazu in einem speziellen Verzeichnis, und der Dämon übernimmt die Aufgabe, es im Hintergrund zu starten. Sie können mehr bei Wikipedia lesen . Es gibt verschiedene Cron-Daemons, aber auf Ihrem GNU / Linux-System sollte es bereits installiert sein.
Verwenden Sie einen Python-Ansatz (z. B. eine Bibliothek), damit Ihr Skript sich selbst dämonisieren kann. Ja, es ist eine einfache Ereignisschleife erforderlich (bei der Ihre Ereignisse einen Timer auslösen, möglicherweise bereitgestellt durch die Sleep-Funktion).
Ich würde Ihnen nicht empfehlen, 2. zu wählen, da Sie tatsächlich die Cron-Funktionalität wiederholen würden. Das Linux-Systemparadigma besteht darin, mehrere einfache Tools interagieren zu lassen und Ihre Probleme zu lösen. Wählen Sie den anderen Ansatz, es sei denn, es gibt zusätzliche Gründe, warum Sie einen Dämon erstellen sollten (zusätzlich zum regelmäßigen Auslösen).
Wenn Sie Daemonize mit einer Schleife verwenden und ein Absturz auftritt, überprüft danach niemand mehr die E-Mails (wie von Ivan Nevostruev in den Kommentaren zu dieser Antwort hervorgehoben). Wenn das Skript als Cron-Job hinzugefügt wird, wird es nur erneut ausgelöst.
quelle
crontab
wenn eine Schleife ohne Beendigung in einem Python-Programm verwendet und dann in der Liste registriert wird? Wenn ich solche.py
für stündlich einrichte , werden dadurch viele Prozesse erstellt, die niemals beendet werden? Wenn ja, denke ich, würde dies sehr gerne Daemon.Hier ist eine schöne Klasse, die von hier genommen wird :
quelle
Sie sollten die Python-Daemon- Bibliothek verwenden, sie kümmert sich um alles.
Von PyPI: Library zur Implementierung eines gut verhaltenen Unix-Daemon-Prozesses.
quelle
Sie können fork () verwenden, um Ihr Skript vom tty zu trennen und es weiterhin ausführen zu lassen, wie folgt:
Natürlich müssen Sie auch eine Endlosschleife implementieren, wie z
Ich hoffe, Sie haben damit begonnen.
quelle
nohup
/disown
Befehle würden den Prozess von der Konsole trennen und er würde nicht sterben. Oder Sie könnten es mit init.dSie können das Python-Skript auch mithilfe eines Shell-Skripts als Dienst ausführen lassen. Erstellen Sie zuerst ein Shell-Skript, um das Python-Skript wie folgt auszuführen (Skriptname Arbitary Name)
Erstellen Sie jetzt eine Datei in /etc/init.d/scriptname
Jetzt können Sie Ihr Python-Skript mit dem Befehl /etc/init.d/scriptname starten oder stoppen.
quelle
Eine einfache und unterstützte Version ist
Daemonize
.Installieren Sie es vom Python Package Index (PyPI):
und dann benutze wie:
quelle
cron
ist eindeutig eine gute Wahl für viele Zwecke. Es wird jedoch kein Dienst oder Dämon erstellt, wie Sie es im OP angefordert haben.cron
führt Jobs nur regelmäßig aus (dh der Job startet und stoppt) und nicht öfter als einmal / Minute. Es gibt Probleme mitcron
- Wenn beispielsweise eine vorherige Instanz Ihres Skripts beim nächsten Auftreten descron
Zeitplans und beim Starten einer neuen Instanz noch ausgeführt wird, ist das in Ordnung?cron
behandelt keine Abhängigkeiten; Es wird nur versucht, einen Job zu starten, wenn der Zeitplan dies vorschreibt.Wenn Sie eine Situation finden, in der Sie wirklich einen Daemon benötigen (ein Prozess, der nie aufhört zu laufen), schauen Sie sich das an
supervisord
. Es bietet eine einfache Möglichkeit, ein normales, nicht daemonisiertes Skript oder Programm zu verpacken und es wie einen Daemon arbeiten zu lassen. Dies ist ein viel besserer Weg als das Erstellen eines nativen Python-Daemons.quelle
Wie wäre es mit
$nohup
Befehl unter Linux?Ich verwende es zum Ausführen meiner Befehle auf meinem Bluehost-Server.
Bitte beraten Sie, wenn ich falsch liege.
quelle
Wenn Sie ein Terminal (ssh oder etwas anderes) verwenden und ein Langzeitskript nach dem Abmelden vom Terminal weiterhin verwenden möchten, können Sie Folgendes versuchen:
screen
apt-get install screen
Erstellen Sie ein virtuelles Terminal im Inneren (nämlich abc):
screen -dmS abc
jetzt verbinden wir uns mit abc:
screen -r abc
Jetzt können wir das Python-Skript ausführen:
python keep_sending_mails.py
Von nun an können Sie Ihr Terminal direkt schließen. Das Python-Skript wird jedoch weiterhin ausgeführt und nicht heruntergefahren
Wenn Sie zurückgehen möchten, überprüfen Sie den Ausführungsstatus Ihres Skripts. Sie können ihn
screen -r abc
erneut verwendenquelle
Informieren Sie sich zunächst über Mail-Aliase. Ein Mail-Alias erledigt dies innerhalb des Mail-Systems, ohne dass Sie mit Dämonen oder Diensten oder Ähnlichem herumspielen müssen.
Sie können ein einfaches Skript schreiben, das von sendmail jedes Mal ausgeführt wird, wenn eine E-Mail-Nachricht an ein bestimmtes Postfach gesendet wird.
Siehe http://www.feep.net/sendmail/tutorial/intro/aliases.html
Wenn Sie wirklich einen unnötig komplexen Server schreiben möchten, können Sie dies tun.
Das ist alles was es braucht. Ihr Skript wird einfach wiederholt und schläft.
quelle
do_the_work()
das Skript abstürzen kann und niemand es erneut ausführen kanntry
zu bringen, schlägt nur das Teil fehl und dasexcept:
Teil wird stattdessen aufgerufen (in diesem Fall nichts), aber die Schleife wird fortgesetzt und versucht weiterhin, die Funktion aufzurufen.Ich würde diese Lösung empfehlen. Sie müssen die Methode erben und überschreiben
run
.quelle
Um etwas zu erstellen, das wie ein Dienst ausgeführt wird, können Sie Folgendes verwenden:
Das erste, was Sie tun müssen, ist die Installation des Cement- Frameworks: Cement-Frame-Arbeit ist eine CLI-Frame-Arbeit, auf der Sie Ihre Anwendung bereitstellen können.
Befehlszeilenschnittstelle der App:
interface.py
YourApp.py-Klasse:
Beachten Sie, dass Ihre App auf einem Thread ausgeführt werden muss, um ein Daemon zu sein
Um die App auszuführen, tun Sie dies einfach in der Befehlszeile
quelle
Angenommen, Sie möchten wirklich, dass Ihre Schleife rund um die Uhr als Hintergrunddienst ausgeführt wird
Für eine Lösung, bei der Sie Ihrem Code keine Bibliotheken hinzufügen müssen, können Sie einfach eine Dienstvorlage erstellen, da Sie Linux verwenden:
Legen Sie diese Datei (normalerweise
/etc/systemd/system/
) in Ihrem Daemon-Dienstordner ab und installieren Sie sie mit den folgenden systemctl-Befehlen (für die wahrscheinlich sudo-Berechtigungen erforderlich sind):Sie können dann mit dem folgenden Befehl überprüfen, ob Ihr Dienst ausgeführt wird:
quelle
Verwenden Sie den von Ihrem System angebotenen Service Manager - verwenden Sie beispielsweise unter Ubuntu upstart . Dadurch werden alle Details für Sie behandelt, z. B. Start beim Booten, Neustart beim Absturz usw.
quelle