スクリプト名は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
ps | grep | grep -v grep
あるいは、2つのプロセスが表示されたら、pgrep
2つの一致するプロセスが実行されています。ps ...
パイプラインを通さずにパイプラインを実行して直接確認してくださいwc -l
。pgrep
それではなく、pgrep
完全に別々のプログラムですps
。詳細を確認しますman pgrep
が、要約すると実行pgrep -f server.sh | wc -l
これは、then、then
ps
にパイプされます。これはコマンドライン引数「server.sh」を検索しているため、独自のパイププロセスの1つ(最初のプロセス)と一致します。grep
grep -v
wc -l
grep
grep
grep server.sh
これを避ける一般的な方法(以前から存在していた頃から)は何かをすること
pgrep
でした。grep
に慣れるgrep [s]erver.sh
orなどの独自のコマンドラインを一致させるか、grep server\\.sh
awkを使用してください。ps aux | awk '/[s]erver\.sh/ {count++}; END {print count}'
または、数の代わりに一致するPIDのリストを取得したい場合:
ps aux | awk '/[s]erver\.sh/ {print $1}'
また、プロセス実行可能ファイル名のデフォルト名部分に対して正確な一致を実行するオプションが、長い間
ps
Linuxパッケージprocps
でサポートされています。-C cmdlist
たとえば、プロセス名全体が実際に表示されていて
ps -C apache2
も、apache2プロセスが一覧表示されます。これは正規表現の一致ではありませんが、基本名と正確に一致します。プロセスは表示されません。ps aux | grep [a]pache2
/usr/sbin/apache2
ps -C apache
apache2
から
man ps
:
-C cmdlist
コマンド名で選択します。これにより、実行可能ファイル名で指定されたプロセスが選択されます
cmdlist
。注:コマンド名はコマンドラインとは異なります。以前のバージョンの
procps
カーネルでは、このコマンド名は15文字に切り捨てられました。この制限は両方の場合、もはや存在しません。 15文字だけを一致させることに頼ると、一致を取得できなくなる可能性があります。