7 Stimmen

Wie kann ich einen ganzen Prozessbaum mit Perl beenden?

Was ist der beste Weg, um einen Prozess und alle seine Kindprozesse aus einem Perl-Skript zu beenden? Es sollte zumindest unter Linux und Solaris laufen und keine Installation von zusätzlichen Paketen erfordern.

Meine Vermutung wäre, eine Liste aller Prozesse und ihrer Eltern zu erhalten, indem man die Dateien in /proc oder die Ausgabe von ps (beides scheint nicht zwischen Linux und Solaris übertragbar zu sein); und dann das Beenden aller Prozesse im Baum (was anfällig für Race Conditions zu sein scheint).

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

9voto

Chris Jester-Young Punkte 212385

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

kill -$signum, $pgid;

$signum ist die Signalnummer, und $pgid ist die Prozessgruppen-ID. Signalnummern sind jedoch nicht sehr portabel, in diesem Fall können Sie (auf einigen Plattformen; siehe perlfunc zur Erläuterung) tun Sie Folgendes (zum Senden SIGTERM zum Beispiel):

kill 'TERM', -$pgid;

0 Stimmen

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

0 Stimmen

Solange Sie nicht SIGKILL verwenden, können Sie Ihr Perl-Programm dazu bringen, das Signal, das Sie senden, zu ignorieren. Lesen Sie perlipc (suchen Sie nach "process group").

8voto

CPAN hat eine Antwort. Ja, ich weiß, Sie wollten keine zusätzlichen Module installieren, aber zumindest können Sie sich die Implementierung anschauen und sehen, was sie tun...

https://metacpan.org/pod/Proc::ProcessTable

0voto

Yann TM Punkte 1843

Ich habe "rkill" angepasst und gehackt, um die Aufgabe zu erledigen, das war einfach.

https://gitlab.com/pslist/pslist/blob/master/pslist

Dies ist Teil des Pakets "pslist" in z.B. Ubuntu.

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