Ich führe mein Python-Skript im Hintergrund auf meinem Ubuntu-Rechner (12.04) wie folgt aus:
nohup python testing.py > test.out &
Nun ist es möglich, dass mein Vorgesetzter irgendwann Python script
aus irgendeinem Grund sterben kann.
Ich denke also an eine Art cron agent
In-Bash-Shell-Skript, das mein übergeordnetes Python-Skript automatisch neu starten kann, wenn es aus irgendeinem Grund beendet wird.
Ist das möglich zu tun? Wenn ja, wie lässt sich dieses Problem am besten lösen?
AKTUALISIEREN:
Nach dem Erstellen der testing.conf
Datei wie folgt -
chdir /tekooz
exec python testing.py
respawn
Ich habe den Befehl sudo unterschritten, um ihn zu starten, aber ich kann nicht sehen, dass der Prozess mit ps ax hinterherläuft.
root@bx13:/bezook# sudo start testing
testing start/running, process 27794
root@bx13:/bezook# ps ax | grep testing.py
27806 pts/3 S+ 0:00 grep --color=auto testing.py
Irgendeine Idee, warum px axe mir nichts zeigt? Und wie überprüfe ich, ob mein Programm läuft oder nicht?
Dies ist mein Python-Skript -
#!/usr/bin/python
while True:
print "Hello World"
time.sleep(5)
/etc/init
Datei vornehmen ? Wenn Sie mir eine schrittweise Anleitung geben können, werde ich in der Lage sein, etwas zu lernen und das Richtige zu tun.sys.stdout = open(file_name, 'w')
am Anfang tun .px ax | grep testing.py
. Gibt es mir nichts zurück? Irgendeine Idee warum?Sie könnten auch einen eher schalenorientierten Ansatz wählen. Suchen Sie
cron
nach Ihrem Skript und starten Sie es erneut, wenn es stirbt.Erstellen Sie eine neue Crontab, indem Sie ausführen
crontab -e
. Dies öffnet ein Fenster Ihres bevorzugten Texteditors.Fügen Sie diese Zeile der gerade geöffneten Datei hinzu
Speichern Sie die Datei und beenden Sie den Editor.
Sie haben gerade ein neues
crontab
Skript erstellt , das alle 5 Minuten ausgeführt wird und das Skript startet, sofern es nicht bereits ausgeführt wird. Sehen Sie sich hier ein nettes kleines Tutorial ancron
. Die offiziellen Ubuntu-Dokumentecron
sind hier .Der aktuell ausgeführte Befehl
pgrep
durchsucht laufende Prozesse nach der in der Befehlszeile angegebenen Zeichenfolge.pgrep foo
sucht nach einem benannten Programmfoo
und gibt dessen Prozesskennung zurück .pgrep -f
Durchsucht die gesamte Befehlszeile, die zum Starten des Programms verwendet wird, und nicht nur den Programmnamen (nützlich, da dies ein Python-Skript ist).Das
||
Symbol bedeutet "Tun Sie dies, wenn der vorherige Befehl fehlgeschlagen ist". Wenn Ihr Skript nicht ausgeführtpgrep
wird, schlägt das fehl, da es nichts findet und Ihr Skript gestartet wird.quelle
crontab -e
aus dem Verzeichnis ausführen, in dem sich mein Python-Skript befindet. Richtig?cron
ist ein Scheduling-Daemon, ein Dienst, der im Hintergrund ausgeführt wird. Wenn sich Ihr Python-Skript nicht in Ihrem befindet$PATH
(wenn Sie es nicht von überall aus starten können, sondern in seinem Verzeichnis sein müssen), verwenden Sie den vollständigen Pfad zum Skript wie in meiner aktualisierten Antwort.Sie können das Testprogramm die Ausgabe mit einer Befehlszeilenoption umleiten lassen und dann ein einfaches Python-Skript verwenden, um das Programm auf unbestimmte Zeit neu zu starten:
Sie können dieses Programm in den Hintergrund stellen, und wenn Sie aufhören möchten, ziehen Sie es einfach in den Vordergrund und beenden Sie es.
quelle
Sie sollten dies nicht wirklich für die Produktion verwenden, aber Sie könnten:
Wenn der Python-Prozess aus irgendeinem Grund beendet wird, wird die Shell-Schleife fortgesetzt und neu gestartet, wobei sie
.out
wie gewünscht an die Datei angehängt wird. Fast kein Overhead und sehr wenig Zeit zum Einrichten.quelle
Es gibt verschiedene Möglichkeiten, Prozesse unter UNIX / Linux zu überwachen und neu zu erstellen. Eines der ältesten ist ein "Respawn" -Eintrag in / etc / inittab ..., wenn Sie das alte SysV-Init-System verwenden. Eine andere Methode ist die Verwendung des Supervisor-Daemons aus dem daemontools- Paket von DJ Bernstein . Andere Optionen sind die Verwendung von Funktionen in Ubuntu upstart ... oder systemd oder anderen.
Sie können sich aber Alternativen init und insbesondere den Python-Code für Pardus: mudur daemon ansehen .
Wenn Sie sich für einen Cron-Job (und die Verarbeitung von PID-Dateien) entscheiden, sollten Sie diesen PEP 3143 lesen und möglicherweise dessen Referenzimplementierung verwenden.
Wie ich in meinen anderen Kommentaren angedeutet habe, ist die robuste Handhabung von PID-Dateien schwierig. Es ist anfällig für Rennen und Corner Cases. Es wird schwieriger, wenn die Wahrscheinlichkeit besteht, dass Ihre PID-Datei auf einem NFS oder einem anderen vernetzten Dateisystem landet (ein Teil der Atomicity garantiert, dass Sie bei einigen Versionen und Implementierungen von NFS die Semantik der Dateibehandlung auf richtigen lokalen UNIX- / Linux-Dateisystemen verlieren). beispielsweise). Auch die Semantik der Dateisperrung unter UNIX kann schwierig sein. (Wird eine
flock
oderfcntl
Sperre in Ihrem Zielbetriebssystem sofort freigegeben, wenn der Prozess, der sie hält, beispielsweise mit SIGKILL beendet wird?)quelle
Sie können auch verwenden mit ps- watcher Überwachung von Monitoren oder Prozessen verwenden
Hier ist ein Beispiel für Ihr Szenario:
Schauen Sie sich einige Beispiele an
quelle
Sie benötigen einen Supervisor, den Sie verwenden können Supervisor verwenden . Es ist ein Python-basierter Supervisor, der bei Bedarf leicht geändert werden kann.
Die Steuerung erfolgt mit Dateien mit INI-Dateisyntax.
quelle
Terdons Antwort hat bei mir nicht funktioniert, weil
pgrep -f testing.py
es nie „versagt“ hat. Es würde die PID für den Cron-Job abrufen (wegen der Option -f). Ohne die Option -f kann pgrep testing.py jedoch nicht finden, da es keinen Prozess namens testing.py gibt.Meine Lösung war, dies zu ändern
zu
Dies bedeutet, dass der vollständige Crontab-Auftrag wie folgt lautet:
quelle
In meinem Fall wollte ich als schnelle Lösung mein Programm am Laufen halten, wenn es mit einem Fehler beendet oder beendet wurde. Andererseits wollte ich die Ausführung stoppen, wenn das Programm korrekt beendet wurde (Rückkehrcode = 0)
Ich habe es auf Bash getestet. Es sollte in jeder anderen Shell gut funktionieren
quelle
Für die Antwort von terdon
pgrep -f testing.py
wird gemäß den Kommentaren hier nie false zurückgegeben :Für Matts Antwort
pgrep -f testing.py
ist es nutzlos, da espgrep python
mit jedem laufenden Python-Skript übereinstimmt. Wenn also zwei Python-Skript-Cronjobs ausgeführt werden, wird der zweite Cronjobs niemals ausgeführt.Und dann habe ich die Lösung
pgrep -f testing.py
im Kommentar hier gefunden: https://askubuntu.com/questions/1014559/running-pgrep-in-a-crontab?noredirect=1&lq=1Mein Cron für das Ausführen von zwei Python-Skripten:
quelle