web-dev-qa-db-ja.com

ps aux |ドット付きgrep

実行中のプロセスを把握するスクリプトを作成しようとしています。

実際のgrepがps aux出力から戻ってくるのを避けようとしています。

ただし、ドットを使用するかどうかによって、さまざまな結果が得られます。

ps aux | grep [s]eleniumは何も返しません。

ps aux | grep [s]elenium.jarはgrepコマンドを返します。

beebee   36155  0.0  0.0  15940   956 pts/0    S+   16:20   0:00 grep --color=auto Selenium.jar

何故ですか?

4
Beebee

現在のフォルダにはSelenium.jarという名前のファイルがありますが、Seleniumというファイルはありません。

走ったら

 ps aux | grep [s]elenium.jar

シェルは[s]elenium.jarを現在のフォルダーの一致するファイル名に置き換えようとします。一致するSelenium.jarというファイルがある場合、[s]elenium.jarSelenium.jarに置き換えられます。

シェルは、置き換えられた値でコマンドを実行します。

ps aux | grep Selenium.jar

この引用を避けるために、正規表現をシェルから保護するには:

ps aux | grep '[s]elenium.jar'
12
Florian Diesch

ここでの問題は、@ Florianが知覚的に figured out であるため、シェルが文字列をgrepに渡す前に、検索文字列のグロブ文字を一致するファイル名に展開していることです。

ps aux | grep fooコマンド自体はfooと一致するため、出力に表示されるため、grep fooの実行には問題があります。複雑な場合、これには2つの一般的な回避策があります。パイプの最後にgrep -v grepを追加するか、代わりにgrep [f]ooを使用します。 grepは正規表現で動作するため、[f]を「括弧内の文字のリスト内の任意の文字」として扱います。括弧内の文字はfだけなので、[f]oofooと同等です。ただし、grepの結果に表示されるpsプロセスはstring[f]ooを持つため、grepには見つかりません。

あなたの場合のように、現在のディレクトリにfooというファイルがある場合、これはより複雑になります。 grepに与えた式を引用していないため([s]eleniumまたは'[s]elenium'ではなく"[s]elenium"を使用したため)、シェルはそれを glob として扱います=そして、一致するファイル名に展開します。これは、実際にgrepに渡されるのは[s]eleniumではなくSeleniumであるため、[s]eleniumトリックは役に立たないので、grepはそれ自体と一致します。

ただし、このすべては、ジョブに適切なツールを使用していないためにのみ発生します。よくあることですが、そのためのアプリがあります! grep + psを使用しないでください。代わりに、pgrepを使用してください。

NAME
       pgrep,  pkill  -  look  up  or signal processes based on name and other
       attributes

SYNOPSIS
       pgrep [options] pattern
       pkill [options] pattern

DESCRIPTION
       pgrep looks through the  currently  running  processes  and  lists  the
       process IDs which match the selection criteria to stdout.  All the cri‐
       teria have to match.  For example,

         $ pgrep -u root sshd

だから、あなたの場合、あなたはちょうどすることができます

pgrep Selenium

または、Javaを介して実行しているため、コマンドライン全体を検索する-fを使用します。

pgrep -f Selenium
5
terdon

initial grepの後に「grep」を除外できます。

ps aux | grep '[s]elenium.jar' | grep -v grep
1
drew