• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:シェル/grep 同名プロセスのカウント)

シェル/grep 同名プロセスのカウント

このQ&Aのポイント
  • ターミナルで複数のbashプロセスの数を調べる方法を教えてください。
  • lessプロセスの数を調べると、正しい数値が返ってきますが、自作シェルスクリプトの場合は正しい数値よりも1つ多くなります。
  • 間違った操作をしているのかどうか、理由を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.3

>の場合、grepが検索しているのは'bash'ではなく'test.sh'ですが、サブシェルを表すpsコマンドの出力に'test.sh'という文字列が含まれているのでしょうか。 そうですね。含まれています。 パイプを流れる文字列を途中で見てみましょう。 cmd=`basename $0` cnt=`ps ax | grep $cmd | tee /dev/tty | grep -v -c grep` echo $cnt のようにしてみてください。grep $cmd の結果が、端末(/dev/tty)に表示されます。 あるいは、grep 前の ps の出力を見た方が良いかもしれない。 cnt=`ps axf | tee /dev/tty | grep $cmd | grep -v -c grep` とか。 サブシェルを使わなければ、数は増えません。 cmd=`basename $0` ps axf | tee /dev/tty | grep $cmd | grep -v -c grep > /tmp/1 read cnt < /tmp/1 echo $cnt

RASUM2
質問者

お礼

notnot様、ありがとうございます。 サブシェルのpsコマンドの出力がわかりました。 teeコマンドの使い方に感激しました。 2014年8月9日

その他の回答 (2)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

なんの不思議もありません。 バッククオートや$() でコマンドを実行するときに、 (コマンドラインを入力した)bashを親とした子プロセスが作られ、そこで実行します。 その時に、 パイプラインを使った場合等では、その処理のために、シェルが実行されます(サブシェルと言ったりします) cnt=`ps ax | grep 'bash' | grep -v -c 'grep'` だと、このコマンドラインを入力したbashを親として bash -c "ps ax | grep 'bash' | grep -v -c 'grep'" が実行されます。このbashは、コマンドライン入力したbashとは別のプロセスです。 スクリプトを実行するときも同じです。 test.sh 等と実行したとき、test.shの中身を実行するのは、コマンドライン入力した親のbashではなく、そこから呼び出された子のbashです。 この点は、スクリプト初心者が陥りやすい罠になっています。 環境設定用に #env.sh export TEST_PATH=/foo/bar というスクリプトを作ったとします。 これを使おうと、 env.sh と実行しても、 export~が実行されるのは、子シェルです。環境変数は、親→子には引き継がれますが、逆には対応できません。 親シェルの方は、この設定が実行前のままになります。 親シェルで実行するには、 sourceを使う必要があります。 このあたりは、Windowsのバッチファイルとは違うので注意しましょう。

RASUM2
質問者

補足

kmee様、丁寧な回答をありがとうございます。 理解力がなくてなさけないですが、 $ cat test.sh   cmd=`basename $0`   cnt=`ps ax | grep $cmd | grep -v -c 'grep'`   echo $cnt の場合、grepが検索しているのは'bash'ではなく'test.sh'ですが、サブシェルを表すpsコマンドの出力に'test.sh'という文字列が含まれているのでしょうか。 2014年8月8日

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

バッククオートで「サブシェル」を起動してるからでは?

RASUM2
質問者

補足

kmee様、ありがとうございます。 自作のスクリプトを走らせて検索した場合も1つ多い数となるのが不思議です。この場合はlessと同じように正しい数が返ってくると思うのですが。 2014年8月8日

関連するQ&A