2016-07-27 8 views
0

Ich versuche, einen Server zu stoppen, der ein Subprozess ist, wenn der Elternprozess von einem Cntrl-D (EOF auf Stdin) getötet wird. Ich habe viele Möglichkeiten versucht, einschließlich stdin im Subprozess zu lesen, aber das blockiert alle Tastatureingaben. Gibt es eine Möglichkeit, den Unterprozess zu beenden, wenn der Elternprozess ein EOF findet.Unterprozess auf Steuerelement-D beenden?

Erstellen eines Teilprozesses in Python über subprocess.Popen

Polling für EOF in subprocess durch das:

self.t = threading.Thread(target=self.server.serve_forever) 
self.t.start() 
# quit on cntrl-d (EOF) 
while True: 
    if len(sys.stdin.readline()) == 0: 
     self.stop() 

def stop(self): 
    manager.save() 
    # shutdown bottle 
    self.server.shutdown() 
    # close socket 
    self.server.server_close() 
    self.t.join() 
    sys.exit() 
+0

Lassen Sie den übergeordneten Prozess Es signalisiert dem Kind, dass es Zeit ist, zu gehen. –

+0

@thatotherguy das nicht funktioniert, wenn ein Benutzer zwangsweise den übergeordneten Prozess mit einem Steuerelement-d beendet, gibt es keine Signalausbreitung dort. –

+0

Ctrl-D ist kein Zwangsausstieg. In Ihrem Snippet scheinen Sie explizit codiert zu haben, um eof zu erkennen und zu beenden. Sagen Sie dem Kind einfach, dass es als Teil davon, z. mit Pythons Thread-Ereignissen. –

Antwort

0

mit @thatotherguy ‚s Vorschlag der Verwendung von os.getppid(), hier ist die neue Arbeitslösung um den Kindprozess zu beenden, wenn er durch den Elternteil verwaist ist (dh wenn ein Steuerelement-D auf dem Elternelement auftritt und es schließt, ohne das Kind zu signalisieren)