GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann man alle Threads (und untergeordneten Elemente) eines Prozesses unter Linux neu erstellen?

Sie können /proc/$PID/task verwenden Um alle Threads eines bestimmten Prozesses zu finden, können Sie daher

verwenden
$ ls /proc/$PID/task | xargs renice $PRIO

bis renice alle Threads Zugehörigkeit zu einem bestimmten Prozess.

Genauso /proc/$PID/task/$PID/children kann verwendet werden, um alle untergeordneten Prozesse zu finden (oder /proc/$PID/task/*/children wenn Sie alle untergeordneten Prozesse wollen aller Threads eines bestimmten Prozesses).

$ cat /proc/$PID/task/$PID/children | xargs renice $PRIO
$ cat /proc/$PID/task/*/children | xargs renice $PRIO

Suche alle PIDs bis renice rekursiv

Wir müssen die PIDs aller Prozesse ("normal" oder "Thread") erhalten, die Nachkommen (Kinder oder in der Thread-Gruppe) des zu bearbeitenden Prozesses sind. Dies sollte rekursiv sein (unter Berücksichtigung von Kindeskindern).

Anton Leontjew answer's gibt den Hinweis dazu:alle Ordnernamen in /proc/$PID/task/ sind die PID von Threads, die einen children enthalten Datei, die potenzielle untergeordnete Prozesse auflistet.

Allerdings fehlt es an Rekursivität, also ist hier ein schnelles und schmutziges Shell-Skript, um sie zu finden:

#!/bin/sh
[ "$#" -eq 1 -a -d "/proc/$1/task" ] || exit 1

PID_LIST=
findpids() {
        for pid in /proc/$1/task/* ; do
                pid="$(basename "$pid")"
                PID_LIST="$PID_LIST$pid "
                for cpid in $(cat /proc/$1/task/$pid/children) ; do
                        findpids $cpid
                done
        done
}

findpids $1
echo $PID_LIST

Wenn der Prozess PID 1234 derjenige ist, den Sie rekursiv nett machen möchten, können Sie jetzt Folgendes tun:

renice -n 15 -p $(/path/to/findchildren.sh 1234)

Randnotizen

Netter Wert oder CPU-Anteile?

Bitte beachten Sie, dass Nice-Werte heutzutage aufgrund der automatischen Task-Gruppierung möglicherweise nicht mehr so ​​​​relevant "systemweit" sind, insbesondere wenn systemd verwendet wird . Weitere Einzelheiten finden Sie in dieser Antwort.

Unterschied zwischen Threads und Prozessen

Hinweis:Diese Antwort erklärt Linux-Threads genau.

Kurz gesagt:Der Kernel behandelt nur "ausführbare Entitäten", also etwas, das ausgeführt werden kann und geplant . Kernelweise werden diese Entitäten als Prozesse bezeichnet. Ein Thread ist nur eine Art Prozess, der (mindestens) Speicherplatz und Signalhandler mit einem anderen teilt. Jeder dieser Prozesse hat eine systemweit eindeutige Kennung:die PID (Process ID).

Als Ergebnis können Sie können renice jeden "Thread" einzeln, weil sie ihre eigenen haben PID.

Weitere Informationen zu PID (ProcessID) und TID-Unterschied (ThreadID) finden Sie in dieser Antwort.


Wir sollten die Prozess-PID und die Thread-ID, die manchmal als TID oder im ps-Befehl LPW geschrieben wird, nicht verwechseln. Die s Befehl hat Optionen zum Anzeigen von Threads und unter top oder htop Sie wechseln zwischen Threads und Prozessen mit H Buchstabe. Wie zuvor von @Totor gesagt, haben mit NPTL, der aktuellen Implementierung mit Kernel> 2.6, alle Threads dieselbe PID, aber sie haben eine unterschiedliche TID. Sie zeigen alle Threads eines Prozesses durch:

$ ps -Ljf <pid>

Diese tid sind die Namen der Verzeichnisse unter /proc/<pid>/task , und selbst wenn renice(1) sagen, dass sein Standardargument eine PID ist, wenn es auf eine PID angewendet wird, ändert es nur den Haupt-Thread (dies ist ein Fehler in der Linux-Implementierung, wie in setpriority(2) beschrieben). ), es kann auch auf ein tid angewendet werden und es erneuert den Faden. Deshalb ist die Antwort von @Anton gültig.

Aber meistens gibt es einen einfacheren Weg, um das gewünschte Ergebnis zu erzielen, alle diese Threads teilen sich die gleiche pgid, die die PID des Gruppenleiters ist; Sie können per pgid kündigen, indem Sie Folgendes ausgeben:

$ renice -g <pgid>

Wenn Sie keinen anderen Prozess wiederholen möchten, der von demselben Gruppenleiter abhängt, müssen Sie das Rezept von @Anton verwenden:

$ renice <priority> $(ls -1 /proc/<pid>/task)

oder:

$renice <priority> $(ps --no-header -Lo tid <pid>)

Vielleicht möchten Sie auch wissen, was die anderen Prozesse derselben Gruppe sind, außer dem Prozess, den Sie renicen möchten, d. h. die Prozesse, die dieselbe pgid haben. Sie können ps(1) verwenden , ps erlaubt keine Auswahl von Prozessen nach Gruppenleiter, aber Sie können ps grep es zu tun. Die Prozesse mit pgid 1908 wird durch den Befehl gegeben:

$ ps --no-header axo pid,pgid |sed -n '/^ *[0-9][0-9]*  *1908/s/[0-9][0-9]* *$//p'

oder wenn Sie awk sed vorziehen:

$ ps --no-header axo pid,pgid|awk '{if ($2=="1908") print $1;}'

Linux
  1. So starten Sie den Linux-Befehl im Hintergrund und trennen den Prozess im Terminal

  2. So finden und töten Sie den Zombie-Prozess in Linux

  3. Linux – Wie beschränke ich einen Prozess auf einen CPU-Kern in Linux??

  4. So legen Sie die Linux-Prozesspriorität mit den Befehlen nice und renice fest

  5. So ändern Sie die Prozesspriorität mithilfe von Linux Nice- und Renice-Beispielen

So unterbrechen Sie einen Prozess und setzen ihn später in Linux fort

So arbeiten Sie mit Vordergrund- und Hintergrundprozessen unter Linux

So erhalten Sie die CPU-Auslastung eines einzelnen Prozesses in Linux

So finden Sie die PID und PPID eines Prozesses in Linux

So beenden Sie Prozesse in Linux mit kill, killall und pkill

So verfolgen und verfolgen Sie einen Linux-Prozess