プロセス確認

私もpgrep,pkillは知らなかったので大変参考になった。
が、どうも使う気がしない。なぜなら汎用性が低いと感じるからだ。

  1. 仕事ではAIXを相手にする事が多いが、AIXにはこのコマンドは無い
  2. 検索ワードは実行モジュール名に限られている
    • フルパスによる検索ができない
    • オプション/引数を含めた検索ができない

私の仕事はシステム管理向きで、定期的にプロセス確認をし、死んできたらオペレータの監視コンソールへ通知、というような事をしているが誤報は許されないので非常に慎重さが要求される。同じ実行モジュール名が違うオプションで複数動いている事などよくあり、その中から一意に抽出しなければならない。javaのデーモンプロセスなんかそうだろう。-classpath,-D...がつらつらと並び、最後に重要なクラス名が出てくる。そんな時、pgrepなど使い物にならないのだ。

pkillは怖くて使えない。

$ sleep 30 &
[1] 27737
$ sleep 40 &
[2] 27738
$ pgrep sleep
27737
27738
$ pkill sleep
[1]-  Terminated              sleep 30
[2]+  Terminated              sleep 40

sleep 30の方のみを殺したい場合、どうするんだろう...。

開発時期にテスト環境で使うなら多少のミスは許されるだろうが、本番実稼動しているマシンにとてもじゃないが使えない。(まぁそもそもコマンドが無いし、kill自体許される場面は稀だが。

ということで、汎用性が低く、使う場面が限られるんじゃないかなと思う。シェルの操作法を教える際にこれらのコマンドを教える意味がどれ程あるか、ちょっと疑問。私が教える立場ならpgrep,pkillは「こんなものもあるよ」程度の紹介に止め、本筋はpsコマンドで教える。シェル初心者が相手ならば尚更だ。ps -ef | grep hoge | grep -v grepは確かに面倒だが、どのUNIXでも使えるし、パイプの練習にもなるからだ。

あと、ps auxってBSD系のUNIX? 商用のUNIXで使えるのかな...。ps -efの方が一般的だと思っていたんだが。

余談だけど、ps -eo "pid,args"とかすれば、好みの識別子だけ表示できる。詳しくはManpage of PSで(Linuxの場合)。