在服务器重启时随机占用AJP端口

我有一个以/etc/init.d/tomcatX脚本(其中X是[1-9]数字)开头的框中有9个tomcat实例(前面加上了apache和mod_jk)。 这些脚本很简单:

 #!/bin/sh ### BEGIN INIT INFO # Required-Start: mysql ### END INIT INFO case "$1" in 'start') /usr/local/tomcat5/bin/startup.sh touch /var/lock/subsys/tomcat5 ;; 'stop') /usr/local/tomcat5/bin/shutdown.sh rm -f /var/lock/subsys/tomcat5 ;; *) echo "Usage: $0 { start | stop }" ;; esac exit 0 

这些服务在服务器重启时启动:

 > chkconfig -l ... tomcat1 0:off 1:off 2:off 3:on 4:off 5:on 6:off tomcat2 0:off 1:off 2:off 3:on 4:off 5:on 6:off tomcat3 0:off 1:off 2:off 3:on 4:off 5:on 6:off tomcat4 0:off 1:off 2:off 3:on 4:off 5:on 6:off tomcat5 0:off 1:off 2:off 3:on 4:off 5:on 6:off tomcat6 0:off 1:off 2:off 3:on 4:off 5:on 6:off tomcat7 0:off 1:off 2:off 3:on 4:off 5:on 6:off tomcat8 0:off 1:off 2:off 3:on 4:off 5:on 6:off tomcat9 0:off 1:off 2:off 3:on 4:off 5:on 6:off 

问题是,有时(这是非常罕见的,随机的和不可重现的)其中一个tomcats将不会启动,因为它的AJP端口已经被占用:

 May 27, 2012 2:08:16 PM org.apache.jk.common.ChannelSocket init INFO: Port busy 8015 java.net.BindException: Address already in use May 27, 2012 2:08:16 PM org.apache.jk.common.ChannelSocket init SEVERE: Can't find free port 8015 8015 

所以它会继续启动过程,并启动所有的webapps,但不幸的是,他们永远不会收到任何http请求。

相关的configuration是:

 <Connector port="8015" protocol="AJP/1.3" ... /> 

可能是什么原因? 没有任何东西在听8015。

我希望你在每个9个tomcat实例的ajp端口中使用唯一的端口号。 我的意思是:

 <Connector port="abcd" protocol="AJP/1.3" ... /> 

我的意思是abcd对于9个tomcat实例中的每一个都是不同的。 也可能是因为其他程序正在使用该端口。 很可能你可能会在你的应用程序中使用数据库,可能是端口。 我的意思是数据库的客户端。 你可以看到哪个程序通过netstat或ss持有端口。 以特权用户身份执行以下操作,查看哪个程序正在保存该端口:

 sudo netstat -antp| grep <port number reported in use> 

在输出中你会看到PID(进程ID)。 然后执行以下操作

 ps -ef| grep <pid from above> 

同样的事情也可以用ss命令来完成,他们认为它更有效率。 谷歌或手册页,看看如何得到同样的事情与SS。 使用ss非常简单。