2017-05-12 11 views
0

背景:Javaプロセスがポートにバインドします。 Javaプロセスは、(jdk8s -XX:OnOutOfMemoryErrorを使用して)サブプロセスでシェルスクリプトを開始するようになりました。このシェルスクリプトは、Javaプロセスを正常に停止します。残念ながら、ポートはまだサブプロセスにバインドされているので、Javaプロセスを再起動することはできません。シェル:開いているポートのFDを取得する方法

私は、FDにソケットに接続されているものをも閉じることができます。だから私の現在の解決策は

INODE=$(netstat -tulpen | grep ":$PORT " | awk '{print $8}') 
FD_SOCKET=$(ls -l /proc/$$/fd | grep socket | grep "\[$INODE\]" | grep -o " [0-9]\+ -> " | awk '{print $1}') 
eval "exec $FD_SOCKET>&-" 

です。これは実際には動作しますが、このパイプモンスターを回避する方法はありますか?

答えて

1

ソケットを強制的にクローズするのではなく、継承したすべてのプロセスを終了させることでOSが処理するようにする方法はありますか?これにはもちろん、スクリプト自体とそれが直接起動するプロセスが含まれますが、atコマンドを使用して再起動をスケジュールする必要があります。

古いVMをシャットダウン完了した後にこのように、スクリプトは、ソケットの問題を無視する可能性があり、単純に次の操作を行います。

at -M now + 0 minutes >/dev/null <<EOF 
java com.my.Server.class & 
EOF 

私はあなたがすでにあなたはときに新しいSocket.setReuseAddress()を使用する必要があるかもしれないことを認識していると推定プロセスはソケットを作成します。

関連する問題