GNU/Linux >> Znalost Linux >  >> Linux

Jak obnovit všechna vlákna (a děti) jednoho procesu v Linuxu?

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;}'

Linux
  1. Jak nastavit prioritu procesu Linux pomocí příkazů nice a renice

  2. Jak v Linuxu přejmenuji všechny složky a soubory na malá písmena?

  3. Jak nastavit ID procesu v Linuxu pro konkrétní program

  1. Jak najít a zabít zombie proces v Linuxu

  2. Renice:Jak změnit všechna vlákna?

  3. Linux:Jak zjistit, kde byl proces spuštěn a jak byl spuštěn?

  1. Jak spustit příkaz Linux na pozadí a odpojit proces v terminálu

  2. Linux – Jak omezit proces na jedno jádro CPU v Linuxu?

  3. Jak nainstalovat a nakonfigurovat Monit na Linuxu pro monitorování procesů