web-dev-qa-db-ja.com

「ps」が独自のプロセスを報告しないようにするにはどうすればよいですか?

$ 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)が報告されないようにする方法はありますか?

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

53
Steve Bennett

私の答えは、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
}
15
Noah Spurrier

@jamzed簡潔な回答の+1。ただし、OPはいくつかの説明が必要になる場合があります。

ps | grep "[d]jango"

その正規表現を使用して、正規表現が"Django"ではなく"[d]jango"と一致するため、そのps文字列がそれ自体と一致しないプロセスを起動しています。そうすることで、この場合はgrepである文字列「[d] jango」を持つプロセスを除外します。同じことは、正規表現を定義するために使用したコマンド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.
67
hmontoliu

ps | grep [d]jango

ps | grep d[j]ango

...

ps | grep djang[o]

30
jamzed

代わりにpgrepを使用してください:pgrep -lf Django

18
ramruma

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

ps | grep Django | grep -v grep
11
Steve Bennett

ps -d | grep Django

男のpsから:

 -d                  Lists information  about  all  processes
                     except session leaders.
8
blah