0

シェルスクリプトで、このようなコマンドを実行したとしましょう

for i in `ps -ax|grep "myproj"`
do
  echo $i
done

ここで、grep コマンドは別のプロセスとして実行されます。次に、シェルスクリプトでその PID を取得するにはどうすればよいですか?

4

2 に答える 2

1

バックグラウンドでプロセスを実行すると、その 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 を見つけることはできません。

于 2012-07-02T06:51:27.007 に答える
1

私はここで手足を出していますが、これはコメントのように見えることを理解しています.

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 を知る必要はありません。これは、ループの繰り返しとして表示されることがないためです。

于 2012-07-02T06:54:35.243 に答える