2 Stimmen

Prozess wiederherstellen mit subprocess.Popen?

Ich habe ein Python-Programm, das Folgendes verwendet subprocess.Popen um einen anderen Prozess (Python-Prozess oder was auch immer) zu starten, und nach dem Start speichere ich die PID des Kindprozesses in einer Datei. Nehmen wir an, dass der Elternprozess plötzlich stirbt (wegen einer Ausnahme oder was auch immer). Gibt es eine Möglichkeit, erneut auf das Objekt zuzugreifen, das von Popen ?

Ich meine, die Grundidee ist, die Datei zunächst zu lesen, und wenn sie existiert und eine PID darauf geschrieben ist, dann irgendwie auf diesen Prozess zuzugreifen, um den Rückgabecode oder was auch immer zu erfahren. Wenn es keine PID gibt, dann starte den Prozess mit Popen .

Vielen Dank!!!

0 Stimmen

Können Sie etwas genauer erklären, warum Sie ein Popen-Objekt benötigen, welche Methoden von Popen Sie aufrufen möchten und was der Elternprozess mit dem Kindprozess macht (schreibt nach stdin, beendet ihn, prüft, ob er noch lebt?)?

3voto

liwp Punkte 6536

Das Popen-Objekt ist eigentlich nur ein Wrapper für die Kindprozesse PID, stdin, stdout und stderr sowie einige Komfortfunktionen für deren Verwendung.

Es stellt sich also die Frage, warum Sie Zugriff auf das Popen-Objekt benötigen? Wollen Sie mit dem Kind kommunizieren, es beenden oder prüfen, ob es noch läuft?

In jedem Fall gibt es keine Möglichkeit, ein Popen-Objekt für einen bereits laufenden Prozess erneut zu erwerben.

Der richtige Weg ist, das Kind als Daemon zu starten, wie Tobu vorgeschlagen hat. Ein Teil der Prozedur zur Daemonisierung eines Prozesses besteht darin, stdin und stdout zu schließen, so dass Sie diese nicht verwenden können, um mit dem Kindprozess zu kommunizieren. Stattdessen verwenden die meisten Daemons entweder Pipes oder Sockets, um Clients zu erlauben, sich mit ihnen zu verbinden und ihnen Nachrichten zu senden.

Der einfachste Weg, mit dem Kindprozess zu kommunizieren, ist, eine benannte Pipe vom Kindprozess aus zu öffnen, z.B. /etc/my_pipe, diese benannte Pipe vom Eltern-/Kontrollprozess aus zu öffnen und von dort aus zu schreiben/lesen.

Nach einem kurzen Blick auf python-daemon scheint es mir, dass python-daemon Ihnen helfen wird, Ihren Kindprozess zu dämonisieren, was schwierig zu bewerkstelligen ist, aber es hilft Ihnen nicht mit der Messaging-Seite der Dinge.

Aber wie gesagt, ich denke, Sie müssen uns sagen, warum Sie ein Popen-Objekt für den Kindprozess benötigen, bevor wir Ihnen weiterhelfen können.

1voto

Mike D. Punkte 1427

Wenn ein Prozess stirbt, werden alle seine offenen Datei-Handles geschlossen. Dies schließt alle unbenannten Pipes ein, die von popen() . Also, nein, es gibt keine Möglichkeit, eine Popen Objekt nur aus einer PID. Das Betriebssystem wird Ihren neuen Prozess nicht einmal als Elternteil betrachten, so dass Sie nicht einmal eine SIGCHLD Signale (obwohl waitpid() könnte noch funktionieren).

Ich bin mir auch nicht sicher, ob das Kind garantiert überlebt, da ein Schreibvorgang in eine Pipe ohne Leser (nämlich die umgeleitete stdout des Kindes) sollte das Kind mit einer SIGPIPE .

Wenn Sie wollen, dass Ihr Elternprozess dort weitermacht, wo der Kindprozess aufgehört hat, müssen Sie den Kindprozess starten, um in eine Datei zu schreiben, normalerweise in /tmp o /var/log und lassen Sie es seine PID aufzeichnen, wie Sie es jetzt tun (der übliche Ort ist /var/run ). (Das Schreiben in eine benannte Pipe birgt die Gefahr, dass es mit SIGPIPE wie oben). Wenn Sie den Dateinamen mit der PID ergänzen, kann der Managerprozess leicht herausfinden, welche Datei zu welchem Daemon gehört.

0voto

Tobu Punkte 23823

Es sieht so aus, als ob Sie versuchen, einen Daemon zu schreiben, und der braucht pidfile-Unterstützung. Sie können nichts falsch machen mit python-daemon .

Zum Beispiel:

import daemon
import lockfile
import os

with daemon.DaemonContext(pidfile=lockfile.FileLock('/var/run/spam.pid')):
    os.execl('/path/to/prog', args…)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X