「ps」が独自のプロセスを報告しないようにする方法は?


52
$ ps | grep django
28006 ttys004    0:01.12 /usr/bin/python bin/django celeryd --beat
51393 ttys005    0:01.45 /usr/bin/python bin/django celeryd -l INFO
51472 ttys005    0:01.29 /usr/bin/python bin/django celeryd -l INFO
51510 ttys005    0:01.89 /usr/bin/python bin/django celeryd -l INFO
51801 ttys005    0:01.83 /usr/bin/python bin/django celeryd -l INFO
53470 ttys005    0:03.97 /usr/bin/python bin/django celeryd -l INFO
53780 ttys005    0:00.00 grep django

最後のプロセス(つまり、psコマンドと同時に開始されたgrep)が報告されないようにする方法はありますか?

(私はリテラルと一致するがそれ自体とは一致しない正規表現を考え出そうとしましたが、それは、ええと、正しいアプローチではないようでした...)

回答:


14

私の答えは、psリストで「foobar」を検索するための典型的な答えのバリエーションです。の議論"-A" "ps"は、よりも移植性が高い"aux"と思いますが、この変更は答えとは無関係です。典型的な答えは次のようになります。

$ ps -A -ww | grep [f]oobar

代わりに、次のパターンを使用します。

$ ps -A -ww | grep [^]]foobar

主な利点は、[^]]探しているパターンと静的な文字列を単純に連結するだけなので、このパターンに基づいてスクリプトを記述しやすいことです。文字列の最初の文字を取り除き、それを四角括弧の間に挿入し、それを再び連結する必要はありません。シェルでスクリプトを作成する場合、[^]]探しているパターンの前に単純に貼り付ける方が簡単です。Bashでの文字列スライスは見苦しいため、私のバリエーションではそれを避けています。このバリエーションは、パターンが先頭の右角かっこなしで一致する行を表示すると言います。角かっこを除外する検索パターンは実際に角かっこをパターンに追加するため、一致することはありません。

したがってpsgrep、次のように移植可能なコマンドを書くことができます。ここでは、Linux、OS X BSD、その他の違いを考慮します。これにより、から列ヘッダーが追加されps、よりカスタム化されたps私のニーズに合った形式をより良くし、余分な、余分な幅をリストするプロセスを表示して、コマンドライン引数のいずれも見逃さないようにします。まあ、ほとんどが見逃されていません。JavaはJavaであるため、可能な限り最悪の方法で動作することが多いため、一部のJavaサービスは、プロセステーブルが追跡する引数の最大許容長を超えて実行されます。これは1024文字だと思います。プロセスの開始に許可されるコマンドローンの長さははるかに長くなりますが、カーネルプロセステーブルは1Kを超える長さを追跡することはありません。コマンドが開始されると、コマンド名と引数リストは不要になります。そのため、プロセステーブルに格納されるのは単なる情報です。

psgrep ()
{
    pattern=[^]]${1};
    case "$(uname -s)" in
        Darwin)
            ps -A -ww -o pid,ppid,nice,pri,pcpu,pmem,etime,user,wchan,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
        ;;
        Linux)
            ps -A -ww -o pid,ppid,tid,nice,pri,pcpu,pmem,etime,user,wchan:20,stat,command | grep -i -e "^[[:space:]]*PID" -e ${pattern}
        ;;
        *)  # other UNIX flavors get a minimalist version.
            ps -A -ww | grep -i -e ${pattern}
        ;;
    esac
}

欠点は、これが実際に元のパターンよりも(前に)1文字多く一致することです。たとえば、これはPIDと一致しません。で使用すると、少し誤解を招く可能性がありますgrep --colour
トニン

67

@jamzedの簡潔な回答の場合は+1ですが、OPには説明が必要な場合があります。

ps | grep "[d]jango"

その正規表現を使用すると、正規表現はでなくであるため、ps文字列がそれ自体と一致"django"しないプロセスを起動します"[d]jango"。この方法では、文字列「[d] jango」を持つプロセスを除外します。この場合はgrepです。同じことがpgrep、egrep、awk、sedなど、正規表現の定義に使用したコマンドに適用できます。

男7正規表現から

   A bracket expression is a list of characters enclosed in "[]".  It nor‐
   mally matches any single character from the list (but see  below).   If
   the  list  begins  with  '^',  it matches any single character (but see
   below) not from the rest of the list.  If two characters  in  the  list
   are  separated  by '-', this is shorthand for the full range of charac‐
   ters between those two (inclusive) in the collating sequence, for exam‐
   ple,  "[0-9]" in ASCII matches any decimal digit.  It is illegal(!) for
   two ranges to share an endpoint, for example, "a-c-e".  Ranges are very
   collating-sequence-dependent,  and portable programs should avoid rely‐
   ing on them.

2
クール。私は実際に正規表現にかなり慣れていますが、正規表現が一致するのを防ぐ方法をすぐに考えることはできませんでした。角かっこで文字を囲むことは完全に理にかなっています。([^!]のようなものも含めると...)
スティーブベネット

1
それは素晴らしくて巧妙です。
アッシュ

「ps」固有の場合、検索するプロセス名の前に「[]」を使用します。その場合、正規表現のためにプロセス名を特別に解析する必要はありませんが、それでも一致します。
ネロマンサー14年

@hmontoliuたとえば次のようには機能しませんps aux | grep [s]cript1。解決策についてコメントをお寄せください。
-SOUser

@hmontoliu私のせい。以前の検索のために行が表示されているようです
...-SOUser

30

ps | grep [d]jango

ps | grep d[j]ango

...

ps | grep djang[o]


1文字をgrepする必要がある場合はスペースを追加します。ps aux| grep "[Z] "
AD

@jamzedたとえば、動作しません:ps aux | grep [s]cript1またはps aux | grep [s]cript2。grep行は引き続き表示されます。解決策についてコメントをお寄せください。
-SOUser

@jamzed私のせい。以前の検索のために行が表示されているようです
...-SOUser

18

代わりにpgrepを使用します。 pgrep -lf django


いつものように、プラットフォーム(この場合はOS X)について言及するのを忘れました。おそらく、pgrepはさまざまなLinuxで動作します。
スティーブベネット

同意しません、@ ramruma。私はpgrepまさにこの問題を与えてくれるので、このスレッドに来ました。しかし、私はCygWinでテストしていると言わなければなりません(psプロセスの完全なコマンドラインを表示することはできません)。
ソパラホデアリエレス14

マニュアルには、「実行中のpgrepまたはpkillプロセスは、それ自体を一致として報告することはありません。」と書かれており、実際、それを確認していません。
デルタブ

私はpgrep自分自身に一致すると思っていた問題に対処してきました。bash実行元のスクリプトファイルの名前と一致していたことがわかりました。-x修正して追加すると、コマンド名と完全に一致します。
andynormancx

11

ああ、これはうまくいきます

ps | grep django | grep -v grep

7
プロセスのコマンドラインに合法的に含まれていない場合のみgrep、一般的なケースでは期待できません。
CVn

8

ps -d | grep django

男PSから:

 -d                  Lists information  about  all  processes
                     except session leaders.

私のまだgrepを表示しています...
ケビン

うん、それはOS X上で私のために働く
スティーブベネット14年

Linuxではそれほどうまく機能しません。
Acumenus 14

より一般的には、オプションpsは移植性がないことで悪名高いため、これがどのプラットフォーム向けかについての情報がなければ、この回答はあまり役に立ちません。さらに、探しているプロセスがプロセスリーダーでないことを確信できない場合、これは明らかに適切ではありません(つまり、ターゲットがデーモンである場合に役立ちますが、一般的にはそうではありません)。
-tripleee

面白いことに、Macではこれはgrepプロセスのみを表示し、他のすべてを除外するようです。
クリストファーハンター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.