psが使えない環境でプロセスIDを取得する

Dockerコンテナ上で動作している Webアプリケーションで、プロセスが kill されたときの挙動を調べたかった。

が、kill コマンドはあるのだが、ps コマンドが無いので、プロセスIDを取得することができなかった。ps を入れても良いのだが、共有の開発用のコンテナだったので、あまり余計なものを入れたくない。

ちょっと調べてみると /proc 以下を見ればいいよ、ということがわかった。

$ ls -la /proc/
total 0
dr-xr-xr-x 618 root root    0 Jun 20 06:51 .
drwxr-xr-x   1 root root   28 Jun 20 06:51 ..
dr-xr-xr-x   9 root root    0 Jun 20 06:51 1
dr-xr-xr-x   9 root root    0 Jun 20 06:54 126
dr-xr-xr-x   9 root root    0 Jun 20 06:52 16
dr-xr-xr-x   9 root root    0 Jun 20 06:53 24
(略)

このように数字のディクレクトリが出てくるが、この数字がプロセスIDである。このプロセスIDが何のアプリケーションと対応しているかというと、数字のディレクトリの中にある cmdline というファイルを見れば良い。

今回のケースでは数が少なかったので問題ないが、プロセスがたくさんある場合は、以下のように一括で表示してくれるコマンドを叩くといいと思う。

ls /proc/*/cmdline | egrep [0-9]+ | xargs -I{} sh -c 'echo {}; cat {}; echo'

ちょっと適当に作ったのでノイズがあるが、必要なものは得られるはず。