2008-11-20 7 views
7

Was ist der beste Weg, um einen Prozess und alle seine untergeordneten Prozesse von einem Perl-Skript zu beenden? Es sollte mindestens unter Linux und Solaris laufen und keine Installation zusätzlicher Pakete erfordern.Wie kann ich mit Perl einen ganzen Prozessbaum töten?

Meine Vermutung wäre, eine Liste aller Prozesse und ihrer Eltern durch Parsing von Dateien in/proc oder durch Parsing der Ausgabe von ps (von denen keine scheint tragbar zwischen Linux und Solaris) zu erhalten; und dann alle Prozesse im Baum (die anfällig für Race-Bedingungen zu sein scheint).

Ich könnte mit den Rennbedingungen in diesem speziellen Fall leben, aber wie bekomme ich portabel die Prozessliste?

Antwort

9

Wenn Sie mit dem Töten einer Prozessgruppe leben können, können Sie die folgende verwenden:

kill -$signum, $pgid; 

wo $signum die Signalnummer ist, und $pgid ist die Prozessgruppen-ID. Allerdings Signalnummern sind nicht sehr tragbar, in diesem Fall können Sie (auf einigen Plattformen; perlfunc, um Erläuterungen lesen) die folgenden Schritte aus (SIGTERM, zum Beispiel senden):

kill 'TERM', -$pgid; 
+0

Welche Prozesse gehören zu einer Prozessgruppe? Ich verwende IPC :: Open3, um einen Prozess zu starten (der unter Solaris den Befehl innerhalb von sh -c ausführt), und ich möchte den Befehl sh und meinen tatsächlichen Befehl und alle weiteren Subprozesse beenden. Was ist, wenn die Prozessgruppe sogar den Perl-Interpreter enthält? Kann das nicht passieren? – oliver

+0

Solange Sie nicht SIGKILL verwenden, können Sie Ihr Perl-Programm dazu bringen, das von Ihnen gesendete Signal zu ignorieren. Lesen Sie perlipc (suchen Sie nach "Prozessgruppe"). –

Verwandte Themen