GNU/Linux >> Linux の 問題 >  >> Linux

Linuxで1つのプロセスのすべてのスレッド(および子)を解放する方法は?

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

Linux
  1. Linux –Linuxでプロセスを1つのCPUコアに制限する方法は??

  2. Linux の Nice および Renice の例を使用してプロセスの優先度を変更する方法

  3. Linux ですべてのフォルダーとファイルの名前を小文字に変更するにはどうすればよいですか?

  1. Linuxコマンドをバックグラウンドで起動し、ターミナルでプロセスをデタッチする方法

  2. Linux で特定のプログラムのプロセス ID を設定する方法

  3. Linux ですべてのプロセスの起動をログに記録するにはどうすればよいですか?

  1. Linuxでゾンビプロセスを見つけて殺す方法

  2. niceおよびreniceコマンドを使用してLinuxプロセスの優先度を設定する方法

  3. プロセス監視のために Linux に Monit をインストールして構成する方法