リッスンしているポートを適切に閉じずにクラッシュすることがあるレガシーアプリケーション(私は制御していません)があります。ボックスを再起動する以外に、特定のポートでのリッスンを停止するSolarisコマンドはありますか?
上手。まだ開いているポートを見つけるには、ゾンビになったプロセス、または使用できなくなったプロセスを見つける必要があります。プロセス名またはPIDがわかっている場合は、pfiles
、preap
、pkill
などのコマンドで使用すると非常に便利です。
PIDまたはプロセス名で開いているポートを検索できるスクリプトがあります。
#!/usr/bin/ksh -p
process=$1
# if $1 is all numbers, then assume it's a PID, and get the parent process.
if [[ $process = +([0-9]) ]]; then
for pid in $( ptree $process | grep '^[0-9]' | awk '{print $1}' ); do
pfiles $pid | egrep "^$pid:|sockname"
done
else
# if $1 is/has letters, then assume it's a process name, and grep accordingly.
for pid in $( ptree | grep $process | grep '^[0-9]' | awk '{print $1}' ); do
pfiles $pid | egrep "^$pid:|sockname"
done
fi
これにより、PID、プロセス名、および$ 1に一致するプロセスに対して開いているソケットが出力されます。
どのPIDがそのソケットを開いたままにしていて使用できないかが正確にわかったら、pkill
またはpreap
コマンドのいずれかを使用して、そのPIDとそれが開いているファイル記述子を強制的に閉じることができます。
ポートがまだリスニング状態にある場合、アプリケーションはまだ何らかの形で実行されています。コマンドlsof -iを使用して、まだリッスンしているプロセスを確認し、それを強制終了します。
lsofツールがインストールされていない場合は、ps -efでアプリケーションの実行中のプロセスを検索する必要があります。