pgrep プロセス数に追加数が表示される

pgrep プロセス数に追加数が表示される

スクリプト名はserver.shです。

 #!/bin/bash
 
  process_count=$(ps aux | grep server.sh | grep -v grep | wc -l )
  echo "total process running:"
  echo $process_count

... other script code

スクリプトを実行すると、私が得た結果は次のようになります。

./server.sh
total process running:
2

プロセス数が1ではなく2で表示されるのはなぜですか? 1つのスクリプトだけを実行し、grepプロセスも除外しました。 pgrep -f server.shを使用してpgrepを除いて、プロセス数は2になります。

答え1

  1. ps | grep | grep -v grepあるいは、2つのプロセスが表示されたら、pgrep2つの一致するプロセスが実行されています。ps ...パイプラインを通さずにパイプラインを実行して直接確認してくださいwc -l

  2. pgrepそれではなく、pgrep完全に別々のプログラムですps。詳細を確認しますman pgrepが、要約すると実行pgrep -f server.sh | wc -l

  3. これは、then、thenpsにパイプされます。これはコマンドライン引数「server.sh」を検索しているため、独自のパイププロセスの1つ(最初のプロセス)と一致します。grepgrep -vwc -lgrepgrepgrep server.sh

  4. これを避ける一般的な方法(以前から存在していた頃から)は何かをすることpgrepでした。grepに慣れるgrep [s]erver.shorなどの独自のコマンドラインを一致させるか、grep server\\.shawkを使用してください。

    ps aux | awk '/[s]erver\.sh/ {count++}; END {print count}'
    

    または、数の代わりに一致するPIDのリストを取得したい場合:

    ps aux | awk '/[s]erver\.sh/ {print $1}'
    
  5. また、プロセス実行可能ファイル名のデフォルト名部分に対して正確な一致を実行するオプションが、長い間psLinuxパッケージprocpsでサポートされています。-C cmdlist

    たとえば、プロセス名全体が実際に表示されていてps -C apache2も、apache2プロセスが一覧表示されます。これは正規表現の一致ではありませんが、基本名と正確に一致します。プロセスは表示されません。ps aux | grep [a]pache2/usr/sbin/apache2ps -C apacheapache2

    からman ps

   -C cmdlist

コマンド名で選択します。これにより、実行可能ファイル名で指定されたプロセスが選択されますcmdlist

注:コマンド名はコマンドラインとは異なります。以前のバージョンのprocpsカーネルでは、このコマンド名は15文字に切り捨てられました。この制限は両方の場合、もはや存在しません。 15文字だけを一致させることに頼ると、一致を取得できなくなる可能性があります。

関連情報