LinuxでプロセスIDをgrepして引数に渡す方法
某社の案件でアプリが挙動不審なため、Javaのスレッドダンプを定期的に取ろうという話になった。
JRockitでは以下のようなコマンドを実行すると標準出力にダンプしてくれるのだけど、
$ jrcmd <pid> prints_thread
引数のプロセスIDをスマートに取得する方法がぱっと思いつかなかった。
で、どうしようかなと思っていたら、某人がawkを使ってさくさく作ってくれた。
$ ps -ef | grep hogehoge | awk '{print $2}'
awkってこういう時に使うんだ、とちょっと関心した。
その時は上記を元にcronに書いておしまいになったけど、実はこれだとgrepを実行したプロセスが入ってしまうので、不完全っぽい。ちゃんと書くと、以下のようになる。
$ ps -ef | grep hogehoge | grep -v 'grep' | awk '{print $2}'
しかし、これは何とも気持ち悪い。
調べてみたところ、1文字目を[]で囲うことで回避できるらしい。
$ ps -ef | grep [h]ogehoge | awk '{print $2}'
これで少しマシになったけど、まだ気持ち悪い。
と思ってたら、pgrepというgrepしてpidを返すというズバリなコマンドがあった。
$ pgrep -f hogehoge
これならすっきりしていてステキ。
先のjrcmdに組み込んでも気持ち悪くない。
$ jrcmd `pgrep -f hogehoge` prints_thread > /var/log/hogehoge
ちなみにpkillというコマンドもあるらしい。
いつも、
$ ps -ef | grep hogehoge $ kill -9 <マウスでプロセスIDを選んでコピペ>
とかやってたけど、1行で書けたのね。