Můžete použít /proc/$PID/task
k nalezení všech vláken daného procesu, proto můžete použít
$ ls /proc/$PID/task | xargs renice $PRIO
do renice
všechna vlákna patřící k danému procesu.
Stejným způsobem /proc/$PID/task/$PID/children
lze použít k nalezení všech podřízených procesů (nebo /proc/$PID/task/*/children
pokud chcete všechny podřízené procesy ze všech vláknů daného procesu).
$ cat /proc/$PID/task/$PID/children | xargs renice $PRIO
$ cat /proc/$PID/task/*/children | xargs renice $PRIO
Nalezení všech PID do renice
rekurzivně
Potřebujeme získat PID všech procesů ("normální" nebo "vlákno"), které jsou potomky (děti nebo ve skupině vláken) procesu, který má být upraven. To by mělo být rekurzivní (s ohledem na děti dětí).
Anton Leontiev answer's dává tip, jak to udělat:všechny názvy složek v /proc/$PID/task/
jsou PID vláken obsahující children
soubor se seznamem potenciálních dětských procesů.
Postrádá však rekurzivitu, takže zde je rychlý a špinavý skript shellu, jak je najít:
#!/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
Pokud je proces PID 1234 ten, který chcete rekurzivně zpříjemnit, nyní můžete:
renice -n 15 -p $(/path/to/findchildren.sh 1234)
Poznámky
Pěkná hodnota nebo sdílení CPU?
Vezměte prosím na vědomí, že v dnešní době nemusí být pěkné hodnoty tak relevantní „v celém systému“, kvůli automatickému seskupování úkolů, zejména při použití systemd . Další podrobnosti naleznete v této odpovědi.
Rozdíl mezi vlákny a procesy
Poznámka:Tato odpověď přesně vysvětluje vlákna Linuxu.
Stručně řečeno:jádro zpracovává pouze „spustitelné entity“, tedy něco, co lze spustit a naplánováno . Pokud jde o jádro, tyto entity se nazývají procesy. Vlákno je jen druh procesu, který sdílí (alespoň) paměťový prostor a obslužné programy signálů s jiným. Každý takový proces má celosystémový jedinečný identifikátor:PID (Process ID).
V důsledku toho můžete renice
každé „vlákno“ jednotlivě, protože mají vlastní PID.
Další informace o rozdílech PID (ProcessID) a TID (ThreadID) naleznete v této odpovědi.
Neměli bychom si plést PID procesu a ID vlákna někdy zapsané TID nebo v příkazu ps LPW. s
příkaz má možnosti pro zobrazení vláken a pod top
nebo htop
přepínáte mezi vlákny a zpracováváte pomocí H
dopis. Jak již dříve řekl @Totor, s NPTL, což je současná implementace s jádrem> 2.6, mají všechna vlákna stejný pid, ale mají odlišný tid. Všechna vlákna procesu zobrazíte pomocí:
$ ps -Ljf <pid>
Tyto tid jsou názvy adresářů pod /proc/<pid>/task
, a to i v případě, že renice(1) řekněme, že jeho výchozí argument je pid, když je aplikován na pid, renice pouze hlavní vlákno (toto je chyba v implementaci linuxu, jak je napsáno v setpriority(2) ), lze jej také nanést na slap a vyčesat nit. Proto je odpověď @Anton platná.
Nejčastěji však existuje jednodušší způsob, jak dosáhnout požadovaného výsledku, všechna tato vlákna sdílejí stejné pgid, což je pid vůdce skupiny; můžete renice pomocí pgid vydáním:
$ renice -g <pgid>
Pokud si nechcete zkrátit nějaký jiný proces, který závisí na stejném vedoucím skupiny, musíte použít @Antonův recept:
$ renice <priority> $(ls -1 /proc/<pid>/task)
nebo:
$renice <priority> $(ps --no-header -Lo tid <pid>)
Můžete také chtít vědět, jaké jsou další procesy stejné skupiny než proces, který chcete renice, tedy procesy, které sdílejí stejné pgid. Můžete použít ps(1) , ps
neumožňuje vybrat procesy vedoucím skupiny, ale můžete použít ps
udělat to. Procesy s pgid 1908
bude dáno příkazem:
$ ps --no-header axo pid,pgid |sed -n '/^ *[0-9][0-9]* *1908/s/[0-9][0-9]* *$//p'
nebo pokud dáváte přednost awk než sed:
$ ps --no-header axo pid,pgid|awk '{if ($2=="1908") print $1;}'