Problemloser plattformübergreifender Prozess-Kill-Daemon

9

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)

AUTOMATISIERUNGSBEISPIEL ( reproduce_bug.py )

%Vor%

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.

%Vor%

Nachdem ich die obige Automatisierung ausgeführt habe, laufen alle untergeordneten script -Sitzungen noch.

> %Vor%

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 ).

FRAGE:

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) ...

%Vor%

Auflösung

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%     
Mike Pennington 22.02.2012, 18:25
quelle

4 Antworten

2

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

    
Andrey Nikishaev 22.02.2012, 21:29
quelle
1

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%     
A.H. 22.02.2012 21:24
quelle
0

Vielleicht könnten Sie os.system () verwenden und einen Killall in Ihrem Watchdog ausführen, um alle Instanzen von / usr / bin / script

zu löschen     
mikhail 22.02.2012 18:33
quelle
0

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:

%Vor%     
Eduardo Ivanec 22.02.2012 19:02
quelle

Tags und Links