/proc/$PID/task
を使用できます 特定のプロセスのすべてのスレッドを見つけるため、使用できます
$ ls /proc/$PID/task | xargs renice $PRIO
renice
まで すべてのスレッド 特定のプロセスに属しています。
同じように /proc/$PID/task/$PID/children
すべての子プロセスを見つけるために使用できます (または /proc/$PID/task/*/children
すべての子プロセスが必要な場合 すべてのスレッドの 与えられたプロセスの)
$ cat /proc/$PID/task/$PID/children | xargs renice $PRIO
$ cat /proc/$PID/task/*/children | xargs renice $PRIO
renice
までのすべての PID を検索しています 再帰的に
必要なプロセスの子孫 (子またはスレッド グループ内) であるすべてのプロセス (「通常」または「スレッド」) の PID を取得する必要があります。これは再帰的であるべきです (子の子を考慮して)。
アントン・レオンチェフ 答えはそうするためのヒントを与えます:/proc/$PID/task/
のすべてのフォルダ名 children
を含むスレッドの PID です 潜在的な子プロセスをリストしたファイル
ただし、再帰性に欠けているため、それらを見つけるための簡単で汚いシェル スクリプトを次に示します。
#!/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
プロセス PID 1234 が再帰的にナイスしたい場合は、次のことができます:
renice -n 15 -p $(/path/to/findchildren.sh 1234)
補足
お得ですか、それとも CPU シェアですか?
最近では、特に systemd を使用する場合、自動タスク グループ化により、nice 値は「システム全体」にあまり関連しない可能性があることに注意してください。 .詳細については、この回答を参照してください。
スレッドとプロセスの違い
注:この回答は Linux スレッドを正確に説明しています
つまり、カーネルは「実行可能なエンティティ」、つまり実行できるもののみを処理します。 および予定 .カーネルに関しては、これらのエンティティはプロセスと呼ばれます。スレッドは、(少なくとも)メモリ空間とシグナルハンドラを別のプロセスと共有する一種のプロセスです。このようなすべてのプロセスには、システム全体で一意の識別子である PID (プロセス ID) があります。
その結果、できる renice
独自のスレッドがあるため、各「スレッド」は個別に PID.
PID (ProcessID) と TID の違い (ThreadID) の詳細については、この回答を参照してください。
プロセス PID とスレッド ID を混同しないでください。TID や ps コマンドの LPW に記述されることがあります。 s
コマンドには、スレッドを表示するオプションがあり、top
の下にあります または htop
H
でスレッドとプロセスを切り替えます 手紙。 @Totor が以前に言ったように、2.6 を超えるカーネルでの現在の実装である NPTL では、すべてのスレッドの pid は同じですが、tid は異なります。プロセスのすべてのスレッドを表示するには:
$ ps -Ljf <pid>
これらの tid は、/proc/<pid>/task
の下のディレクトリの名前です。 、そして renice(1) であっても pid に適用された場合、デフォルトの引数は pid であり、メイン スレッドのみを解放します (これは、setpriority(2) に記述されている Linux 実装のバグです) )、これは tid にも適用でき、スレッドを更新します。それが、@Anton の回答が有効である理由です。
しかし、ほとんどの場合、目的の結果を達成するためのより簡単な方法があります。これらのスレッドはすべて、グループ リーダーの pid である同じ pgid を共有します。以下を発行することにより、pgid で renice することができます:
$ renice -g <pgid>
同じグループリーダーに依存する他のプロセスを放棄したくない場合は、@Anton のレシピを使用する必要があります:
$ renice <priority> $(ls -1 /proc/<pid>/task)
または:
$renice <priority> $(ps --no-header -Lo tid <pid>)
また、再設定したいプロセス以外の同じグループの他のプロセスが何であるかを知りたい場合もあります。つまり、同じ pgid を持つ共有プロセスです。 ps(1) を使用できます 、 ps
グループ リーダーでプロセスを選択することはできませんが、ps
を grep できます それをするために。 pgid 1908
のプロセス コマンドによって与えられます:
$ ps --no-header axo pid,pgid |sed -n '/^ *[0-9][0-9]* *1908/s/[0-9][0-9]* *$//p'
または、sed よりも awk を好む場合:
$ ps --no-header axo pid,pgid|awk '{if ($2=="1908") print $1;}'