プロセスリストからgrepを除外する


27

実行中のデーモンのプロセスIDを返すコマンドをまとめました:

ps aux | grep daemon_name | awk "{ print \$2 }"

それは完全に動作し、PIDを返しますが、おそらく現在実行中のプロセスである2番目のPIDも返します。返されたPIDのリストからコマンドを除外する方法はありますか?

何度かテストしましたが、コマンドは常にリストの2番目のPIDのようですが、不正確な場合に備えて最初のPIDだけを取得したくありません。


回答:


27

grepの-vスイッチは結果を逆にし、キューから除外します。次のようにします:

ps aux | grep daemon_name | grep -v "grep daemon_name" | awk "{ print \$2 }"

更新しました。次のように-Cスイッチを使用してコマンド名を指定することもできます。

ps -C daemon_name -o pid=

後者-oは、リストに含める情報の列を決定します。pidプロセスID列のみをリストします。そして、=その後の等号pidは、その列のタイトルがないことを意味するため、明確な数字(PID)のみを取得します。

お役に立てれば。


2
「grep -v grep」の使用:「grep」を含む長いコマンドラインがあることに注意してください(誰かがgrep library => "-Llibgrep.so"または "-cp libgrep.jar"と書いたとしましょう。少なくともパターンを繰り返します:grep -v "grep daemon_name"
-phil_w

良い点、@ phil_w、ありがとう。答えを更新しました。
Serg ikS

23

文字クラスのトリックを使用できます。「[d]」は「d」のみと一致しません。

 ps aux | grep [d]aemon_name | awk "{ print \$2 }"

私はこれを使用することを好む| grep -v grep


それは賢いトリックです、私はそれが好きです。現時点では、学習中は物事をシンプルに保ち| grep -v grep、コードを再検討すると理解しやすくなります。

この[h] ackの仕組みを理解しようとしています。どういう意味"[d]" does not match "[d]" only "d"ですか?
ノワカー

@Damian:角括弧は、検索式のメタ文字(文字のセットを区切る)であるため、grepコマンドはコマンド自体のps出力行と一致しませんgrep(元の質問では「2番目のPID」と呼ばれていました)。expression a[xy]dはtextと一致しませa[xy]dが、text axdまたはtextと一致しますayd。したがって、expression はtextと[f]oo一致しますfooが、textとは一致しません[f]oo。それが明確であることを願っています。
RedGrittyBrick

さて、私はARGVについて間違っていました。これは単なる正規表現です。ありがとう。
ノワカー

悪魔のように賢い!少し考えなければなりませんでした-ありがとう!
18

15

psより信頼性の高い代替手段がある場合は、の出力の解析を避けてください。

pgrep daemon_name
pidof daemon_name

いや、最終的にプロセス管理は今理にかなっています。
ブワジェマイカリック16年

pgreppidof完全に一致しながら部分文字列で検索-私が必要なものを完全に!ありがとう!
サーシャ

3

このps -Cオプションは、すべてのUnixベースのシステムで一般的ではありませんが、ご使用のシステムで機能する場合です。代わりに、grepを完全に回避します。

ps aux | awk '/daemon_name/ && !/awk/ { print $2 }'

単一引用符でエスケープする必要はありません。 ps auxほとんどのUnixベースのシステム上のプロセスの完全なリストを提供し、awk通常はデフォルトでインストールされます。


3

pgrep名前でプロセスのpidを探すために使用します:

pgrep proc_name

結果に追加のプロセス名(-l)がある場合:

pgrep -l proc_name

プロセス名(-l)および引数(-f)を探して表示します。

pgrep -lf proc_name_or_argument

良い点pgrepは、一致としてそれ自体を報告しないことです。ただし、pidを取得してからpgrep、対応するプロセスを終了する必要はありませんkillpkill代わりに使用します:

pkill proc_name

(デフォルトではなく)SIGKILL信号(-9または-KILL)を指定SIGTERMします。

pkill -9 proc_name

プロセス名(-l)と引数(-f)を探し、シグナル(または)で-I強制終了する前に確認を求めます():SIGKILL-9-KILL

pkill -KILL -Ilf proc_name_or_argument

この-Iオプションはpkill、OS X Mavericksなどの一部のバージョンでのみ利用可能であることに注意してください。


0

bashを使用している場合は、次の方法でこれを行うこともできます。 ps -eaf

PIDS=$(ps -eaf)
PID=$(echo "$PIDS" | grep "process_name" | awk '{print $2}')
echo $PID

これは不必要に複雑です。なぜ単純に電話しないでくださいps -eaf | grep "process_name" | awk '{print $2}'
デビッドネドロー

0

この行は、「grep」を除くpid(プロセスID)を返します

PID=$(ps aux | grep '/usr/bin/python2.7 manage.py SES__boto3_sqs_read' | grep -v grep)

いくつかの説明がいいでしょう。
-davidbaumann

これは基本的に受け入れられた答えと同じですが、装飾が異なります。
スコット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.