Shell:如何获得开放端口的FD

时间:2017-05-12 15:58:15

标签: shell sockets port file-descriptor

背景:java进程绑定到端口。 java进程现在在子进程中启动shell脚本(使用jdk8s -XX:OnOutOfMemoryError)。这个shell脚本成功关闭了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 个答案:

答案 0 :(得分:1)

不是强制关闭套接字,而是允许操作系统通过让所有继承它的进程终止来处理它?当然,这包括脚本本身以及它可能直接启动的任何进程,但它应该可以使用 >>> wordsOfOneDiff('bat', my_list)) ['cat', 'bat', 'bot', 'bag', 'dat'] 命令来安排重新启动。

因此,在旧VM完成关闭后,脚本可以忽略套接字问题,只需执行此操作:

at

我认为您已经意识到在新进程创建套接字时可能需要使用at -M now + 0 minutes >/dev/null <<EOF java com.my.Server.class & EOF