`ps| grep -v |

`ps| grep -v |
ps aux  | grep firefox

"firefox"という文字列を含むすべてのプロセスを一覧表示します。

ps aux  | grep -v firefox

"firefox"文字列を持たないすべてのプロセスを一覧表示します。

ps aux | grep -v grep | grep firefox

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

答え1

次のコマンドを実行するとき

ps aux  | grep firefox

その後、grepプロセスそれ自体探している単語がすでに存在するため、出力に表示されることがあります。たとえば、私のコンピュータで実行する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

grep我々は、プロセス3384が命令であり、一致することが分かる。クロム合金現れる。

これを避けるために、一部の人は2行目を追加して| grep -v grep行を削除します。

一つあるだまされるしかし...

ps aux | grep '[f]irefox'

grep '[f]irefox'まったく同じ行と一致しますgrep firefoxが、grep単語が実際にコマンドに表示されないため、コマンド自体は一致しません。

答え2

このpsコマンドは、現在実行中のすべてのプロセスを出力します。まず、リストからgrepプロセスを削除します。grep2番目は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を見つけるために長い道のりを進む必要があります。

pgreppkillシステムのマニュアルも参照してください。

答え3

分析するps aux | grep -v grep | grep firefox

ps auxプロセスの出力を提供します。最初のgrep()は、grep -v grepその単語を含むすべての行を削除します。その後、出力は再びgrep()され、単語を検索して出力されます。ps auxgrepgrep firefoxfirefox

関連情報