2017-05-12 30 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()进程创建套接字。