467 Stimmen

Wie kann man am besten ein Signal an alle Mitglieder einer Prozessgruppe senden?

Ich möchte einen ganzen Prozessbaum töten. Wie kann ich das am besten mit einer der gängigen Skriptsprachen erreichen? Ich bin auf der Suche nach einer einfachen Lösung.

9voto

hajamie Punkte 2728

Um die Antwort von Norman Ramsey zu ergänzen, kann es sich lohnen, einen Blick auf setsid zu werfen, wenn Sie eine Prozessgruppe erstellen möchten.
http://pubs.opengroup.org/onlinepubs/009695399/functions/setsid.html

Die Funktion setsid() erzeugt eine neue Sitzung, wenn der aufrufende Prozess nicht der Anführer einer Prozessgruppe ist. Bei Rückkehr ist der aufrufende Prozess der der Sitzungsleiter dieser neuen Sitzung, ist der Prozessgruppenleiter Leiter einer neuen Prozessgruppe und darf kein kontrollierendes Terminal haben. Die Prozessgruppen-ID des aufrufenden Prozesses wird gleich der Prozess-ID des aufrufenden Prozesses. Die Adresse aufrufende Prozess muss der einzige sein, der Prozess in der neuen Prozessgruppe und der einzige Prozess in der neuen Sitzung.

Daraus schließe ich, dass Sie eine Gruppe aus dem Startprozess heraus erstellen können. Ich habe dies in php benutzt, um einen ganzen Prozessbaum nach dem Start zu beenden.

Das könnte eine schlechte Idee sein. Ich wäre an Kommentaren interessiert.

8voto

Zombo Punkte 1

Inspiriert durch Kommentar von ysth

kill -- -PGID

statt einer Prozessnummer die Negation der Gruppe angeben Nummer. Wie bei fast allen Befehlen gilt: Wenn Sie ein normales Argument wollen, das mit einer - nicht als Schalter interpretiert werden soll, stellen Sie ihm das Wort --

6voto

genericdave Punkte 367

Es ist super einfach, dies mit Python zu tun, indem man psutil . Installieren Sie einfach psutil mit pip und schon haben Sie eine ganze Reihe von Werkzeugen zur Prozessmanipulation:

def killChildren(pid):
    parent = psutil.Process(pid)
    for child in parent.get_children(True):
        if child.is_running():
            child.terminate()

6voto

davide Punkte 1962

Ausgehend von der Antwort von zhigang wird dadurch die Selbsttötung vermieden:

init_killtree() {
    local pid=$1 child

    for child in $(pgrep -P $pid); do
        init_killtree $child
    done
    [ $pid -ne $$ ] && kill -kill $pid
}

5voto

Mika Vatanen Punkte 3197

Wenn Sie einen Prozess nach Namen beenden wollen:

killall -9 -g someprocessname

または

pgrep someprocessname | xargs pkill -9 -g

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