シェルスクリプトで、このようなコマンドを実行したとしましょう
for i in `ps -ax|grep "myproj"`
do
echo $i
done
ここで、grep コマンドは別のプロセスとして実行されます。次に、シェルスクリプトでその PID を取得するにはどうすればよいですか?
バックグラウンドでプロセスを実行すると、その PID を取得できます。$!
$ ps aux | grep dddddd & echo $!
[1] 27948
27948
ic 27948 0.0 0.0 3932 760 pts/3 R 08:49 0:00 grep dddddd
フォアグラウンドの場合 --- PID を見つけたい時点で、プロセスはもう存在しません。ループに入ると、 for ステートメントは既に実行されておりgrep
、既に終了しているため、その PID を見つけることはできません。
私はここで手足を出していますが、これはコメントのように見えることを理解しています.
grep
コマンドの PID が必要なのはなぜですか?
あなたのコメントでは、ループ内でそれを何かと比較したいと言っています。ループに(時々)含まれるだけでなくmyproj
、grepコマンドに関する項目も含まれるのはあなたの問題だと思いますか?その場合は、次のことを試してください。
for i in `ps -ax | grep -v grep | grep "myproj"`
do
echo $i
done
この-v
スイッチは基本的にパターンを反転するため、grep -v grep
(またはgrep -v "grep"
、少しぎこちなく見えるかもしれません) には、文字列「grep」を含まない行のみが含まれます ( man grepを参照)。たとえば、実際に探しているパターンに文字列「grep」も含まれている場合など、これは場合によっては非常にあいまいになる可能性があることに注意してください。たとえば、次の場合は期待どおりに動作しない可能性があります。ps -ax | grep -v grep | grep mygrepling
ただし、「myproj」のみを探す特定のケースでは、それで十分です。
または、単に使用することもできます
for i in `ps -ax | grep "my[p]roj"`
do
echo $i
done
そうすれば、grep コマンドの PID を知る必要はありません。これは、ループの繰り返しとして表示されることがないためです。