「grep」を使って稼働中のプロセスを確認する際に「grep」自身が引っかからないようにする方法いろいろ

Bash

はじめに

現在稼働中のプロセスを確認するときに、 ps aux コマンドを利用すると思います。
Linux上では多数のプロセスが常時動作しているため、流石にコマンドの表示内容から該当のプロセスを目視で探すのは至難の業です。
したがって grep を使って絞り込むわけですが、よく遭遇する問題とこれを解決する方法について紹介します。

検証環境

$ uname -moi
x86_64 x86_64 GNU/Linux

$ bash -version | head -n 1
GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)

ps auxgrep で絞り込んで見る

絞り込み対象のプロセスを作成します。
yes コマンドは y という文字列をエンドレスで標準出力に出力するコマンドですが、これをバックグラウンド実行します。
単純に実行するとターミナルが y でいっぱいになってしまうので、 /dev/null余談ですが、これをビットバケットと呼びます。 )に流します。

$ yes > /dev/null &
[1] 20

ps aux コマンドの実行結果を grep で絞り込んでみます。

$ ps aux | grep yes
root        20 99.9  0.0   4372   728 pts/0    R    22:59   4:57 yes
root        25  0.0  0.0   9096   836 pts/0    S+   23:04   0:00 grep yes

悲しいことに2行出力されてしまいます。
grep を実行した結果、自分自身も対象として見つかってしまいました。

目視だけならこれを無視すればよいのですが、出力結果を使ってプロセスを停止したい、監視したい場合は不要なものがひっかからないようにしたいところです。

対処方法

その1(grep -v)

grep が邪魔なので、 grep -v で除外してしまいます。

$ ps aux | grep yes | grep -v grep
root        20 99.9  0.0   4372   728 pts/0    R    22:59  13:52 yes

冗長ですが、実現できました。

その1(pgrep)

pgrepコマンドを利用します。

$ pgrep yes
20

高倉健のような口数の少なさです。
コマンド名を渡すと「プロセスID」だけが出力されます。
これで十分なケースもありますが、せめてもう少し情報を出力したい場合には -a オプションを付与できます。

$ pgrep -a yes
20 yes

プロセスIDとともに実行コマンドも表示されましたが、やはり寡黙です。

その3(grep [?]

こちらはハックな方法です。
grep [?] という構文を利用します。( ? 部分は検索対象コマンドの1文字目 )

$ ps aux | grep [y]es
root        20 99.9  0.0   4372   728 pts/0    R    22:59  27:29 yes

無事 grep のプロセスが表示されなくなりました。
多少ハックでよくわかりませんね。

解説

こちらは grep の正規表現の仕組みを利用しています。
grep [y]es は 「1文字目が "y" であり、その後 "es" が続く」という意味になります。[...] の部分は通常は2文字以上を記述して使いますね。

grep [wb]aka だと waka あるいは baka に該当する文字を検索するコマンドとなります。

ps aux の実行結果として、 grep [y]es というプロセスも出力されますが、 yes のパターンとして引っかからないというわけです。

ひとこと

pgrep がシンプルでわかりやすいですね。多くの場合はこれで問題ないと思いますがトラブルシューティング時には他の方法も利用できます。

Bash