Sie können /proc/$PID/task
verwenden Um alle Threads eines bestimmten Prozesses zu finden, können Sie daher
$ 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;}'