プロセスチェックとgrep -v

プロセスチェックと言えばgrep -vですよね?

あるある話としてLinux等のUnix系のシステムではプロセスチェックをpsコマンドを用いて行われていることがあると思います。例えばMySQLのサーバープロセスが起動中かどうかを確認するには以下のようなコマンドで、これをシェルスクリプトにしておいて定期的に実行するなどの簡易の監視の仕組みを取っているシステムもあるでしょう。

ps -ef | grep mysqld

何故だがgrepコマンド自体も引っかかってしまい、以下のようになってしまう件が今回の話題です。

$ ps -ef |grep mysqld
mysql      737     1  0  1月08 ?      00:14:34 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid
user    6854  6772  0 02:45 pts/0    00:00:00 grep --color=auto mysql
$

1つ目のコマンドの結果を2つ目のコマンドで受け取るべくパイプを使っているつもりですが、何故だか2つ目がこんにちはしてる感じです。

何故こんなことが起こるのかはさておき、最悪MySQLは起動もしていないのに誤判定なんて結果は避けたくて、このgrepを取り除くべくよく以下のようにやります。

ps -ef | grep mysqld | grep -v grep

ここで、プチトリックです。得られる結果は同じなので、それがどうしたという話なのですが、grep -vをやらずにちょっとだけスマートにやる方法が以下です。

ps -ef | grep [m]ysqld

mysqlの最初のmを[]で囲っています。そうすると当然ですがps -efの結果には[]付きの状態[m]ysqldになっているものが登場します。grepによる検索は[]の中がmの1文字だけなので結果としてmysqldという文字列を探すという動きになり、自然にgrepコマンド分が脱落するというものです。

[]は本来は、[abc]deとしてadeかbdeかcdeという風に検索されることを狙うのですが、それを逆手に取っています。つまり[a] は aと同じということです。

もしcat – grepを馬鹿にした経験がお有りなら、grep -vも見直してみてはどうでしょうか?

ちなみに、私はcat-moreも目撃したことがあります。