実行中のプロセスを把握するスクリプトを作成しようとしています。
実際の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
何故ですか?
現在のフォルダにはSelenium.jar
という名前のファイルがありますが、Selenium
というファイルはありません。
走ったら
ps aux | grep [s]elenium.jar
シェルは[s]elenium.jar
を現在のフォルダーの一致するファイル名に置き換えようとします。一致するSelenium.jar
というファイルがある場合、[s]elenium.jar
はSelenium.jar
に置き換えられます。
シェルは、置き換えられた値でコマンドを実行します。
ps aux | grep Selenium.jar
この引用を避けるために、正規表現をシェルから保護するには:
ps aux | grep '[s]elenium.jar'
ここでの問題は、@ Florianが知覚的に figured out であるため、シェルが文字列をgrep
に渡す前に、検索文字列のグロブ文字を一致するファイル名に展開していることです。
ps aux | grep foo
コマンド自体はfoo
と一致するため、出力に表示されるため、grep foo
の実行には問題があります。複雑な場合、これには2つの一般的な回避策があります。パイプの最後にgrep -v grep
を追加するか、代わりにgrep [f]oo
を使用します。 grep
は正規表現で動作するため、[f]
を「括弧内の文字のリスト内の任意の文字」として扱います。括弧内の文字はf
だけなので、[f]oo
はfoo
と同等です。ただし、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
initial grepの後に「grep」を除外できます。
ps aux | grep '[s]elenium.jar' | grep -v grep