nfsなりdbへ接続するプロセスがあったとして接続先が原因でプロセスが刺さることは多々ある。
刺さったプロセスがどこに対するIOでその状態になったかを特定する方法
# 刺さったプロセスのPIDを取得 $ ps aux | grep "プロセス名" # pidから開いているソケットを全探索 $ ls -l /proc/${PID}/fd # straceを使ってfdの番号を取得 $ strace -p ${PID} # fdを取得したらreadlinkでシンボリックリンクのリンク先を表示する $ readlink /proc/${PID}/fd/${↑で取得したfd} # ソケットのinodeを頼りにnetstatでgrep $ netstat -ne | grep ${↑で取得したinode}
straceでソケットを取得する方法が意外にもlsofが入ってる環境なら
$ lsof -i -a -p $PID
だけで取得できてしまう。
やってることはファイルディスクリプタとソケットの話がわかればとっても簡単だけどlsofで一発で取れちゃうのはすごい。。