java.net.BindException:地址已在 Debian 上的 tomcat 中使用

java.net.BindException:地址已在 Debian 上的 tomcat 中使用

我正在尝试将一个 Web 应用程序(RODA 2.0)作为 WAR 部署到 Debian Stretch 中的 tomcat 8.5 和 openjdk 8 中,java.net.BindException: Address already in use启动时出现错误(请参阅完整的堆栈跟踪https://pastebin.com/SSDJX6yc)。现在,webapp 确实尝试侦听端口 2552,但该端口未被使用,并且lsof -ni :2552循环运行表明该端口实际上从未被使用。在 osx 上,它甚至在 tomcat 中也能成功启动,并成功侦听给定端口。

我意识到也许 tomcat 安全策略会阻止这种情况发生,但尝试使用 osx 机器上的 catalina.policy 会产生相同的结果。我还尝试在原始 debian 策略文件中添加授权条目:

grant codeBase "war:file:${catalina.base}/webapps/ROOT.war*" {
    permission java.net.SocketPermission "192.168.*:2552", "listen, connect, accept, resolve";
};

您是否知道实际问题可能是什么,以及如何解决它(除了尝试修改 RODA 以不尝试连接给定端口)?

答案1

我找到了问题(很可能):有一个僵尸(已停用)Java 进程正在运行,很可能确实占用了端口 2552。但lsof无法显示它。硬重启后问题消失(软重启似乎没有成功,虚拟机只是没有响应)。

寓意:不要只相信 lsof,尝试其他工具,如 nmap 和 netstat,并警惕僵尸!

相关内容