2012-04-08 117 views
1

因此,我运行一个使用嵌入式jetty和maven app-assembler插件的web服务器。当我直接调用app-assembler应用程序(以root身份运行)时,服务器启动正常。即使在nohup下运行,Web服务器也完全正常启动。Java服务器挂在CentOS启动5

当我将app-assembler脚本注册为init.d脚本(Runlevels 235/Start pri 98/Stop pri 20)并使用service命令运行init.d脚本时,Web服务器在启动过程中会挂起。

应用程序挂起的地方是在Struts 2约定插件中的类路径扫描期间。

如果我杀了使用“杀-QUIT” web服务器,代码看起来是停留在Unix文件系统:

"main" prio=10 tid=0x09add800 nid=0xb33 runnable [0xb7361000] 
    java.lang.Thread.State: RUNNABLE 
     at java.io.UnixFileSystem.getBooleanAttributes0(Native Method) 
     at java.io.UnixFileSystem.getBooleanAttributes(UnixFileSystem.java:228) 
     at java.io.File.isDirectory(File.java:754) 

我做了一些研究,似乎有可能是性能问题与NFS,Java和文件系统访问。

我遇到的问题是我们没有在我们的服务器上运行NFS,并且据我所知我们正在以相同的方式,由同一用户运行该应用程序。

即使模仿服务命令的工作方式(在脚本启动之前运行'env -i'),直接运行脚本也不会挂起。

寻找任何建议或指针来解决这个问题,或任何方式来解决它。

更新(4/8/12)

我使用Sun(甲骨文)JDK 1.6.0_31

/usr/java/latest/bin/java -version 
java version "1.6.0_31" 
Java(TM) SE Runtime Environment (build 1.6.0_31-b04) 
Java HotSpot(TM) Server VM (build 20.6-b01, mixed mode) 
+0

你在使用OpenJDK吗? – Quaternion 2012-04-08 23:55:27

+0

我正在使用Sun JDK。更新的问题包括这个信息 – ArcSine 2012-04-09 00:05:49

+0

这将是很好的尝试OpenJDK。有一个关于它成为标准的Oracle/Sun视频。我所知道的仅仅是我所使用的并且没有任何问题(Ubuntu 11.10/Netbeans/Web应用程序开发/ Glassfish) – Quaternion 2012-04-09 00:32:42

回答

0

所以,我想通了这个问题。看起来像线程被困在文件系统操作中的问题,是由于递归符号链接,Java将无限期地遵循。任何来自Unix系统根目录的扫描都应该导致相同的问题(CPU使用率100%,文件扫描挂起)。

最终的问题是服务脚本从根目录运行,从当前工作目录直接调用脚本。我修改了我的启动脚本,在运行之前移动应用程序组装脚本的根目录,一切正常。

相关问题