web-dev-qa-db-ja.com

`psの2番目のgrepの関数| grep -v | grep`

ps aux  | grep firefox

文字列「firefox」を持つすべてのプロセスをリストします

ps aux  | grep -v firefox

文字列「firefox」なしですべてのプロセスをリストします

ps aux | grep -v grep | grep firefox

この2番目のgrepは何をしますか? grep自体はコマンドですが、なぜ別のgrepをgrepしているのですか?

2
Kranthi Kiran

次のようなコマンドを実行すると

ps aux  | grep firefox

次に、探しているWordが存在するため、grepプロセスitselfが出力に表示されることがあります。例えば私のマシンでchromeを実行すると、同様の結果が得られます。

% ps aux | grep chrome
sweh      3384  0.0  0.0  11128  1024 pts/1    S+   07:08   0:00 grep chrome
sweh     23698  0.0  0.0   6384   620 ?        S    Jul04   0:00 /usr/lib/chromi

プロセス3384はgrepコマンドであり、Word chromeが表示されるため一致します。

これを回避するには、2番目の| grep -v grepを追加してその行を削除します。

チートがあります...

ps aux | grep '[f]irefox'

grep '[f]irefox'grep firefoxとまったく同じ行に一致しますが、grepコマンドは、Wordが文字通りそのコマンドに表示されないため、それ自体に一致することはありません。

9
Stephen Harris

psコマンドは、現在実行中のすべてのプロセスを出力します。最初のgrepは、このリストからgrepプロセスを削除します。 2番目は、フィルターされたリスト内のfirefoxプロセスを抽出します。

これはおそらく、firefoxプロセスのプロセスID(PID)を取得しようとする部分的な試みであり、おそらく実行中かどうかを確認するため、またはプロセスを終了するためです。

その場合は、代わりにpgrep(または、プロセスの終了の場合はpkill)を使用することを強くお勧めします。

if pgrep firefox 2>/dev/null; then
  echo "firefox is already running"
else
  echo "starting firefox..."
  firefox &
done

firefoxを終了するには:

pkill firefox

つまり、しないでください最初にPIDを見つけるのに長い道のりを進みます。

システムのpgrepおよびpkillのマニュアルも参照してください。

6
Kusalananda

分析[ps aux | grep -v grep | grep firefox]

ps auxは、プロセスの出力を提供します。最初のgrep(grep -v grep)は、そこにフィードされるすべての行を、grepを含むps auxから削除します。その後、Word firefoxに対して出力が再度grepped(grep firefox)され、出力が提供されます。

1
igiannak