2017-05-12 31 views
0

背景:Java進程綁定到端口。 java進程現在在子進程中啓動一個shell腳本(使用jdk8s -XX:OnOutOfMemoryError)。這個shell腳本成功關閉了java進程。不幸的是,它不能重新啓動Java進程,因爲端口仍然綁定到子進程...Shell:如何獲取開放端口的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

而不是強制套接字關閉,如何讓操作系統照顧它,讓所有繼承它的進程終止?這當然包括腳本本身以及它可能直接啓動的任何進程,但它應該使用at命令來安排重新啓動。

於是,老VM已完成關停後,該腳本可以忽略插座的問題,簡單地做到這一點:

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

我想你已經知道,你可能需要在新的使用Socket.setReuseAddress()進程創建套接字。