0

仕事用に書いているプログラムがあります。

Sco Unix サーバーに接続し、コマンドを実行します。ほとんどの場合、正常に動作します。

String command = "ps -eo ruser,pid,ppid,stime,etime,tty,args | sort -k4 | grep /PGProcid="+ProcID+"\\ | grep -v grep"; 

たとえば、出力は次のようになります

ps -eo ruser,pid,ppid,stime,etime,tty,args | sort -k4 | grep /PGProcid=1\ | grep -v grep

ただし、これを単一の数値 (通常は 1 ですが、それに限定されません) に対して実行しようとすると、結果が存在することを知っていても、結果が得られません。

たとえば、サーバーで次の結果が得られた場合

# ps -ef | grep /PGProcid=1
 name 29175 29174  0 02:55:57  ttyp15    00:00:00 /xxx/xxx/xxx/prog6 /PGProcid=14
 person2 28201 28199  0 01:15:27  ttyp13    00:00:00 /xxx/xxx/xxx/prog1 /PGProcid=1

次に、次のことを行うと

# ps -ef | grep /PGProcid=1\

結果は得られませんが、1 の結果があることはわかっています。14 のように 2 桁の数字を使用すると、上記が機能し、結果が返されます。

基本的に、/PGProcid= を grep して PID および PPID 番号を取得できる必要があります。これは、1 & 10,11,12 など、または 2 & 20,21,22 などがある場合にのみ機能しないようです。

$ を使用して Egrep を試してみましたが、常に 1 桁の数字をスキップしているようです。

編集:これが私がこのサーバーで試したことです

  # echo $SHELL
  /bin/sh
  ps -ef | grep PGProcid=2
  amanda 23602 25207  0 09:22:58       ?    00:00:06 /xxxxxx /PGProcid=2
  amanda 25207 25203  0   Feb-28       ?    00:00:01 /xxxxxx /PGProcid=2
  root 26389 26034  0 05:15:22   ttyp6    00:00:00 grep PGProcid=2
  amanda 26042 23602  0 04:46:16       ?    00:00:04 /xxxxxx /PGProcid=2

そのため、2 は現在サーバー上でアクティブですが、以下では結果が得られません

  # ps -ef | grep /PGProcid=2$
  # ps -ef | grep /PGProcid=2\$
  # ps -ef | grep "/PGProcid=2$"

以下は結果を示しますが、2が含まれているものもすべてピックアップするため、22などは2の後にのみ表示されます

   # ps -ef | grep '/PGProcid=2$'

以下に「そのようなファイルまたはディレクトリはありません」というエラーが表示されます

   # ps -ef | grep `/PGProcid=2$`
4

1 に答える 1

1

$シェルは環境変数で展開しようとします。$次のいずれかで保護する必要があり\ます。

grep /PGProcid=1\$

または"":

grep "/PGProcid=1$"

編集: より正確に言うと、単語\>の末尾にある空の文字列と一致させるには、を使用する必要があります。との両方がシェルによって解釈されるため、それらも保護する必要があります。\>

grep /PGProcid=1\\\>

また

grep "/PGProcid=1\>"

「単語一致」が必要な場合 (私にはそう思われます)、次の-wオプションを試すこともできます。

grep -w /PGProcid=1
于 2014-03-14T15:41:33.593 に答える