「grep」を使って稼働中のプロセスを確認する際に「grep」自身が引っかからないようにする方法いろいろ
はじめに
現在稼働中のプロセスを確認するときに、 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 aux
を grep
で絞り込んで見る
絞り込み対象のプロセスを作成します。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
がシンプルでわかりやすいですね。多くの場合はこれで問題ないと思いますがトラブルシューティング時には他の方法も利用できます。
ディスカッション
コメント一覧
まだ、コメントがありません