名前と番号によるプロセスのフィルタリング

名前と番号によるプロセスのフィルタリング

プロセス名と良い番号だけが含まれているPID番号を見つけるスクリプトを書くのは難しいです。

答え1

pgrepまず、最初の引数として提供された式に一致するすべてのプロセスのPIDを取得し、次にこれらのプロセスを繰り返して、2番目の引数に対応する良い値を持つプロセスを抽出するために使用されます。

find_pid_by_name_and_nice () {
    pgrep -- "${1:?missing process name}" |
    xargs -I {} ps -o pid= -o nice= -p {} |
    awk -v nice="${2?missing nice value}" '$NF == nice { print $1 }'
}

テスト:

$ find_pid_by_name_and_nice
find_pid_by_name_and_nice:1: 1: missing process name
find_pid_by_name_and_nice:3: 2: missing nice value
$ find_pid_by_name_and_nice netdata
find_pid_by_name_and_nice:3: 2: missing nice value
$ find_pid_by_name_and_nice netdata 19
258881
258937
$ find_pid_by_name_and_nice netdata 15

(出力なし)

答え2

by_name_and_nice(){ grep -hoPs "^[^ ]+(?= \($1\)( [^ )]+){16} $2 )" /proc/*/stat; }

by_name_and_nice bash 0bashniceness = 0(デフォルト)のすべてのプロセスを見つけます。

by_name_and_nice 'b.*' '.*'b名前がaで始まるすべてのプロセスは、良いか悪いかなどに関係なく検索されます。

名前に改行とバイナリごみを含むプロセスも取得するには、より複雑なものが必要です。

by_name_and_nice(){
    local -; set -o pipefail
    LC_ALL=C grep -zhoPs "^[^ ]+(?= \($1\)( [^ )]+){16} $2 )" /proc/*/stat | xargs -0rn1
}

プロセス名で改行文字を一致させるために使用する必要がありますby_name_and_nice '(?s:foo.*)' 0(詳細はPCRE正規表現構文GNU grep-Pオプションで使用されます)。


これは説明目的のためだけに使用され、演算子よりも大きくまたは小さくない状態で適切な値を選択することは意味がありません。さらに、プロセス名に基づいて選択することは、プロセス名がプロセスの完全な制御下にあり、2ビットマルウェアとスパムがプロセス名を絶えず乱用して自分自身を呼び出すかどうかを決定するpsため、信頼性が非常に低いです。bash以下のようにデフォルト名を選択します。

find /proc/*/exe -lname '*/whatever'

残りはすべて読者のための練習として開発してください ;-)

答え3

POSIXlyでは、以下を使用psしてくださいawk

by_name_and_nice() {
  # returns pids of processes with $2 as niceness and whose
  # process name matches the $1 extended regexp
  ps -A -o pid= -o nice= -o comm= |
    NAME=$1 NICE=$2 awk '
      $2 == ENVIRON["NICE"] {
        pid = $1
        sub(/^[[:space:]]*[^[:space:]]+ +[^[:space:]]+ /, "")
        if ($0 ~ ENVIRON["NAME"]) print pid
      }'
}

おなじみの列とプロセス名の間に空白文字があるとします。これは通常、Linuxベースのシステムで検出されますが、POSIXでは保証されていないprocps-ng実装の場合です。 Niceness列の後にあるすべての空白文字を削除できますが、これにより、名前が空白で始まるプロセスを誤って表す危険性があります。

procps-ngは、出力でps最小限に?印刷できない文字を印刷できない文字に変更し、印刷できない文字の構成は呼び出し元のロケールによって異なりますps。たとえば、UTF-8というプロセスは、ロケールがUTF-8とは異なる文字セットを使用しているStéphaneように見えることがあります。St??phane

procps-ng実装は、名前ごとにプロセスを一致させるオプションをサポートしpsます-C(HP / UXからインスピレーションを得ますps)。これは正規表現の一致ではなく、正確なバイトとバイトの同じ一致であるため、次のように実行できます。

by_name_and_nice() {
  # returns pids of processes with $2 as niceness and whose
  # process name is exactly $1
  ps -C "$1" -o pid= -o nice= |
    awk -v nice="$2" '$2 == nice {print $1}'
}

関連情報