- ベストアンサー
シェル/grep 同名プロセスのカウント
- ターミナルで複数のbashプロセスの数を調べる方法を教えてください。
- lessプロセスの数を調べると、正しい数値が返ってきますが、自作シェルスクリプトの場合は正しい数値よりも1つ多くなります。
- 間違った操作をしているのかどうか、理由を教えてください。
- みんなの回答 (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
その他の回答 (2)
- kmee
- ベストアンサー率55% (1857/3366)
なんの不思議もありません。 バッククオートや$() でコマンドを実行するときに、 (コマンドラインを入力した)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のバッチファイルとは違うので注意しましょう。
補足
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)
バッククオートで「サブシェル」を起動してるからでは?
補足
kmee様、ありがとうございます。 自作のスクリプトを走らせて検索した場合も1つ多い数となるのが不思議です。この場合はlessと同じように正しい数が返ってくると思うのですが。 2014年8月8日
お礼
notnot様、ありがとうございます。 サブシェルのpsコマンドの出力がわかりました。 teeコマンドの使い方に感激しました。 2014年8月9日