Ich habe eine Python-Automation, die telnet
-Sessions erzeugt, die ich mit dem Linux script
protokolliere Befehl; Für jede Protokollierungssitzung gibt es zwei script
Prozess-IDs (Eltern und Kind).
Ich muss ein Problem lösen, bei dem, wenn das Python-Automatisierungsskript stirbt, die Sitzungen script
niemals geschlossen werden alleine; Aus irgendeinem Grund ist das viel schwieriger, als es sein sollte.
Bisher habe ich watchdog.py
implementiert (siehe unten), die sich selbst dämmt und die PID des Python-Automatisierungsskripts in einer Schleife abfragt. Wenn die Python-Automatisierungs-PID aus der Prozesstabelle des Servers verschwindet, versucht sie, die script
Sitzungen zu beenden.
Mein Problem ist:
script
-Sitzungen erzeugen immer zwei separate Prozesse, einen der script
Sitzungen sind die Eltern der anderen script
Sitzung. watchdog.py
wird nicht die untergeordneten script
Sitzungen beenden, wenn ich script
Sitzungen aus dem Automatisierungsskript (siehe AUTOMATISIERUNGSBEISPIEL unten) reproduce_bug.py
) Nun das Beispiel was passiert, wenn ich die Automation oben starte ... beachte, dass PID 30017 30018 und PID 30020 30021 spawnt. Alle oben erwähnten PIDs sind script
Sitzungen.
Nachdem ich die obige Automatisierung ausgeführt habe, laufen alle untergeordneten script
-Sitzungen noch.
Ich führe die Automatisierung unter Python 2.6.6 auf einem Debian Squeeze Linux-System (uname -a: Linux Hotcoffee 2.6.32-5-amd64 #1 SMP Mon Jan 16 16:22:28 UTC 2012 x86_64 GNU/Linux
).
Es scheint, dass der Daemon den Absturz des Laichprozesses nicht überlebt. Wie kann ich watchdog.py reparieren, um alle Skriptsitzungen zu schließen, wenn die Automatisierung abbricht (wie im obigen Beispiel gezeigt)?
A watchdog.py
log, das das Problem darstellt (leider stimmen die PIDs nicht mit der ursprünglichen Frage überein) ...
Das Problem war im Wesentlichen eine Wettlaufsituation. Als ich versuchte, die "Eltern" script
Prozesse zu töten, waren sie bereits zufällig mit dem Automatisierungsereignis zusammengebrochen ...
Um das Problem zu lösen ... musste der Watchdog-Daemon zuerst die gesamte Liste der Kinder identifizieren, die getötet werden sollten, bevor die beobachtete PID abgerufen wurde (mein ursprüngliches Skript versuchte, Kinder zu identifizieren, nachdem die beobachtete PID abgestürzt war). Als nächstes musste ich meinen Watchdog-Daemon modifizieren, um die Möglichkeit zu ermöglichen, dass einige script
-Prozesse mit der beobachteten PID abstarben.
watchdog.py:
%Vor%
Ihr Problem ist, dass das -Skript nach dem Erstellen nicht vom Automatisierungsskript getrennt wurde, so dass es als untergeordnetes Element funktioniert und wenn das übergeordnete Element nicht mehr zu verwalten ist.
Um den Python-Skript-Exit zu behandeln, können Sie das Modul atexit verwenden. Um den Ausgang von untergeordneten Prozessen zu überwachen, können Sie os.wait verwenden oder das SIGCHLD-Signal verarbeiten
Sie können versuchen, die komplette Prozess Gruppe mit dem übergeordneten script
, dem untergeordneten script
, dem bash
, das von script
erstellt wurde, und - vielleicht - auch dem% co_de zu löschen % Prozess.
Das telnet
Handbuch sagt:
Wenn pid kleiner als -1 ist, wird sig an jeden Prozess in der Prozessgruppe gesendet, dessen ID -pid ist.
Also wird das Äquivalent von kill(2)
den Job machen.
Oh, die PID, die du brauchst, ist die des Elternteils kill -TERM -$PID
.
Bearbeiten
Das Töten der Prozessgruppe scheint für mich zu funktionieren, wenn ich die folgenden zwei Funktionen in watchdog.py anpassen:
%Vor% Bei einer Inspektion scheint das psu_proc.kill()
(eigentlich send_signal()
) sollte OSError
bei einem Fehler erhöhen, aber nur für den Fall - haben Sie versucht, vor dem Setzen der Flagge auf Beendigung zu prüfen? Wie in: