tanamonの稀に良く書く日記

KEEP CALM AND DRINK BEER

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行で書けたのね。