java.exe に SIGINT を送信するには? [NT]
ant の java タスクで起動したプログラムは CTRL-C を受け取れない の続き。
CTRL-C は SIGINT シグナルのことである。だから、java.exe に CTRL-C を送信できれば、必ずしもターミナルから送信する必要は無い。
結局、kill コマンドを使えばよい。windows の場合でも kill コマンドは存在する。
最終的に、
tlist | grep bin\\java.exe | tail -n 1 | groovy -n -e " println line.split(' ')[0]" | xargs kill
という one-liner で処理することにした。
tlist でプロセスの一覧を出力し、それから bin\\java.exe が含まれる行のみを取り出し、複数の java.exe が合った場合に備え、最後の 1 行だけを抽出し、その行を空白を区切り文字として分割して PID を得て、xargs で kill に渡すと。
grep や xargs の入手については以前に GNU utilities for Win32:experiment に記載した。
わざわざ groovy を使う必要は無く、ruby -e でも awk でも、なんでもできそうだけど、split が簡単に使えたのと、少し前に groovy をインストールしたので使ってみたかった、というどうでも良い理由による。
で、上記 one-liner を bat として置いておけば、簡単に runserver した java.exe を停止できる。
java.exe を runserver 以外で使わないという条件があるけど、その条件を回避するのは手間の費用対効果の観点から実装しない。