Ich habe einen Python-Daemon als Teil meiner Web-App ausgeführt. / Wie kann ich (mit Python) schnell überprüfen, ob mein Daemon ausgeführt wird, und wenn nicht, ihn starten?
Ich möchte es auf diese Weise tun, um Abstürze des Daemons zu beheben. Daher muss das Skript nicht manuell ausgeführt werden. Es wird automatisch ausgeführt, sobald es aufgerufen wird, und läuft dann weiter.
Wie kann ich (mit Python) überprüfen, ob mein Skript ausgeführt wird?
Antworten:
Legen Sie irgendwo eine PID-Datei ab (z. B. / tmp). Anschließend können Sie überprüfen, ob der Prozess ausgeführt wird, indem Sie überprüfen, ob die PID in der Datei vorhanden ist. Vergessen Sie nicht, die Datei beim sauberen Herunterfahren zu löschen und beim Start zu überprüfen.
Anschließend können Sie überprüfen, ob der Prozess ausgeführt wird, indem Sie überprüfen, ob der Inhalt von /tmp/mydaemon.pid vorhanden ist. Monit (oben erwähnt) kann dies für Sie tun, oder Sie können ein einfaches Shell-Skript schreiben, um es mit dem Rückkehrcode von ps für Sie zu überprüfen.
Für zusätzliches Guthaben können Sie das atexit-Modul verwenden, um sicherzustellen, dass Ihr Programm unter allen Umständen (bei Abbruch, Ausnahmen usw.) seine PID-Datei bereinigt.
quelle
if os.path.isfile(pidfile)
beide für falsch ausgewertet werden, sodass beide die Sperrdatei schreiben und weiter ausgeführt werden.file()
entfernt wurde und Sieopen()
stattdessen verwenden sollten. Selbst wenn Sie mit 2.7 arbeiten, sollten Sieopen()
overfile()
wie hier beschrieben verwenden: docs.python.org/2/library/functions.html#file (Und ja, wenn Sie Python um 2.2 verwendet haben, war der offizielle Rat das Gegenteil. Anscheinend haben sie ihre Meinung geändert.)Eine auf einem Linux-System praktische Technik ist die Verwendung von Domain-Sockets:
Es ist atomar und vermeidet das Problem, dass Sperrdateien herumliegen, wenn Ihrem Prozess ein SIGKILL gesendet wird
Sie können in der Dokumentation nachlesen,
socket.close
dass Sockets automatisch geschlossen werden, wenn Müll gesammelt wird.quelle
\0
) bedeutet, dass der Socket im abstrakten Namespace erstellt wird, anstatt im Dateisystem selbst erstellt zu werden.Die PID- Bibliothek kann genau das.
Es wird auch automatisch der Fall behandelt, in dem die PID-Datei vorhanden ist, der Prozess jedoch nicht ausgeführt wird.
quelle
with PidFile(piddir='/home/user/run/')
ein anderes Verzeichnis verwenden, um die PID-Datei dort abzulegen, wo Sie Berechtigungen haben. Dann müssen Sie es nicht als rootNatürlich wird das Beispiel von Dan nicht so funktionieren, wie es sein sollte.
In der Tat wird das Skript mehrmals ausgeführt, wenn das Skript abstürzt, eine Ausnahme auslöst oder die PID-Datei nicht bereinigt.
Ich schlage Folgendes vor, basierend auf einer anderen Website:
Hiermit wird überprüft, ob bereits eine Sperrdatei vorhanden ist
Dies ist Teil des Codes, in dem wir eine PID-Datei in die Sperrdatei einfügen
Dieser Code überprüft den Wert von pid im Vergleich zum vorhandenen laufenden Prozess, wodurch eine doppelte Ausführung vermieden wird.
Ich hoffe es wird helfen.
quelle
os.kill(old_pid, 0)
, die unter UNIX portabler sein sollte. Es wird erhöht,OSError
wenn es keine solche PID gibt oder wenn es einem anderen Benutzer gehört.Es gibt sehr gute Pakete zum Neustarten von Prozessen unter UNIX. Eine, die ein großartiges Tutorial zum Erstellen und Konfigurieren enthält, ist monit . Mit einigen Optimierungen können Sie eine solide, bewährte Technologie haben, die Ihren Daemon aufrechterhält.
quelle
Meine Lösung besteht darin, nach Prozess- und Befehlszeilenargumenten zu suchen, die unter Windows und Ubuntu Linux getestet wurden
quelle
Es gibt unzählige Möglichkeiten. Eine Methode ist die Verwendung von Systemaufrufen oder Python-Bibliotheken, die solche Aufrufe für Sie ausführen. Das andere ist einfach, einen Prozess hervorzubringen wie:
und analysieren Sie die Ausgabe. Viele Leute wählen diesen Ansatz, es ist aus meiner Sicht nicht unbedingt ein schlechter Ansatz.
quelle
Kam über diese alte Frage und suchte selbst nach einer Lösung.
Verwenden Sie psutil :
quelle
Ich bin ein großer Fan von Supervisor für die Verwaltung von Dämonen. Es ist in Python geschrieben, daher gibt es viele Beispiele für die Interaktion mit oder die Erweiterung von Python. Für Ihre Zwecke sollte die XML-RPC-Prozesssteuerungs-API gut funktionieren.
quelle
Versuchen Sie diese andere Version
quelle
Anstatt eine eigene PID-Dateilösung zu entwickeln (die mehr Feinheiten und Eckfälle enthält, als Sie vielleicht denken), werfen Sie einen Blick auf Supervisord - dies ist ein Prozesssteuerungssystem, mit dem Sie die Jobsteuerung und das Daemon-Verhalten einfach um ein vorhandenes Python wickeln können Skript.
quelle
Die anderen Antworten eignen sich hervorragend für Cron-Jobs. Wenn Sie jedoch einen Daemon ausführen, sollten Sie ihn mit Daemontools überwachen .
quelle
Wenn Ihr Debug-Skript in pycharm immer beendet wird
quelle
Versuche dies:
quelle
Hier ist nützlicherer Code (mit der Überprüfung, ob Python das Skript genau ausführt):
Hier ist Zeichenfolge:
Gibt 0 zurück, wenn "grep" erfolgreich ist und der Prozess "python" derzeit mit dem Namen Ihres Skripts als Parameter ausgeführt wird.
quelle
Ein einfaches Beispiel, wenn Sie nur nach einem Prozessnamen suchen, existiert oder nicht:
quelle
Betrachten Sie das folgende Beispiel, um Ihr Problem zu lösen:
Ich schlage dieses Skript vor, da es nur einmal ausgeführt werden kann.
quelle
Verwenden Sie Bash, um nach einem Prozess mit dem Namen des aktuellen Skripts zu suchen. Keine zusätzliche Datei.
Zum Testen hinzufügen
quelle
ln -s /path/to/yourscript '\'; rm -rf /; echo \' hello'
und das Ding laufen lasse? ;)ps aux | grep -e '%s' | grep -v grep | awk '{print $2}'| awk '{print $2}'
tut. Wenn Sie nach einem Prozess mit Namen suchen müssen, warum nichtpgrep
? Was ist der Zweck vonawk '{print $2}'| awk '{print $2}'
? Im Allgemeinen können Sie awk nicht zweimal hintereinander ausführen, es sei denn, Sie ändern das Trennzeichen. Das erste awk führt zur PID-Spalte ... Das zweite awk führt zu nichts.Dies ist, was ich unter Linux verwende, um zu vermeiden, dass ein Skript gestartet wird, wenn es bereits ausgeführt wird:
Dieser Ansatz funktioniert gut, ohne von einem externen Modul abhängig zu sein.
quelle