2009年02月17日(火) [長年日記]
- 昨日まで暑くて今日から寒い。
■ [howto][shell][net] ポートが開いているかをチェックするスクリプト (2)
先月考えたfuserコマンドを使うスクリプトが動作しない環境があった。その環境だと、ポート番号によってはfuserコマンドが出力結果を返してくれない。動かない環境が手元になくて詳しい調査ができず、原因不明。環境の違いは64ビットかどうかくらいだと思う。もしかしたらSELinuxの設定が違うのかもしれない。
仕方ないのでfuserを使わない方法を考えた。netstatコマンドがどうやって空きポートを取得しているのかをソースを読んで調べたところ、/proc/net にある tcp, tcp6, udp, udp6 などを読み込んでいるようだった。ふーん、ここでわかるのか。
しかしシェルスクリプトなら /proc から読み取るより netstat の出力結果から切り出した方が簡単だと思い直し、次のようにして実現した。
if [ -n "`/bin/netstat -ln --tcp | \ /bin/awk '{print $4;}' | \ /bin/grep '^.*:10000$'`" ] ; then echo port is opened. else echo port is closed. fi
これはTCPポート10000が開いているかを調べる例。awkを使うのは富豪的かなあ。
fuserのときのように実行ユーザを気にしたりしなくても大丈夫なはず。ただ、netstatの出力フォーマットに依存するので少し落ち着かない。