Systemctl啟動嵌入Tomcat失敗

Systemctl啟動嵌入Tomcat失敗

我有一個嵌入 Tomcat 8.5 的 java 專案。我已向 sytemd 添加了一項新服務,以將其作為 CentOS 7.2 中的服務運行。當我使用“systemctl start app.service”啟動伺服器時,程式將停止在

"Aug 16, 2018 5:54:13 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/8.5.32"  

我使用“jstack”命令來檢查進程,然後我得到以下資訊:

    2018-08-16 18:28:34
    完整線程轉儲 Java HotSpot(TM) 64 位元伺服器 VM(25.152-b16 混合模式):

    「附加監聽器」#14 守護程式 prio=9 os_prio=0 tid=0x00007fe804001000 nid=0x19a5 等待條件 [0x0000000000000000]
       java.lang.Thread.State:可運行

    "localhost-startStop-1" #13 守護程式 prio=5 os_prio=0 tid=0x00007fe7e0001800 nid=0x190c 可運作 [0x00007fe8204a8000]
       java.lang.Thread.State:可運行
        在 java.io.UnixFileSystem.getBooleanAttributes0(本機方法)
        在 java.io.UnixFileSystem.getBooleanAttributes(UnixFileSystem.java:242)
        在 java.io.File.isDirectory(File.java:849)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2011)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2020)
        在 org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1963)
        在 org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1913)
        在 org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1153)
        在 org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:765)
        - 鎖定(org.apache.catalina.startup.ContextConfig)
        在 org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:299)
        在 org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:94)
        在 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5154)
        - 鎖定(org.apache.catalina.core.StandardContext)
        在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        - 鎖定(org.apache.catalina.core.StandardContext)
        在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1421)
        在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1411)
        在 java.util.concurrent.FutureTask.run(FutureTask.java:266)
        在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        在 java.lang.Thread.run(Thread.java:748)

    "Tomcat-startStop-1" #12 守護程式 prio=5 os_prio=0 tid=0x00007fe8486d7000 nid=0x190b 等待條件 [0x00007fe8205ad000]
       java.lang.Thread.State:等待(停車)
        在 sun.misc.Unsafe.park(本機方法)
        - 停車等候(java.util.concurrent.FutureTask)
        在 java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
        在java.util.concurrent.FutureTask.awaitDone(FutureTask.java:429)
        在 java.util.concurrent.FutureTask.get(FutureTask.java:191)
        在 org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:941)
        - 鎖定(org.apache.catalina.core.StandardHost)
        在 org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:872)
        - 鎖定(org.apache.catalina.core.StandardHost)
        在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        - 鎖定(org.apache.catalina.core.StandardHost)
        在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1421)
        在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1411)
        在 java.util.concurrent.FutureTask.run(FutureTask.java:266)
        在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        在 java.lang.Thread.run(Thread.java:748)

    "NioBlockingSelector.BlockPoller-1" #11 守護程式 prio=5 os_prio=0 tid=0x00007fe8486c3800 nid=0x190a 可運行 [0x00007fe8206ae000]
       java.lang.Thread.State:可運行
        在 sun.nio.ch.EPollArrayWrapper.epollWait(本機方法)
        在 sun.nio.ch.EPollArrayWrapper.poll (EPollArrayWrapper.java:269)
        在 sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:93)
        在 sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
        - 鎖定(sun.nio.ch.Util$3)
        - 鎖定(java.util.Collections$UnmodifyingSet)
        - 鎖定(sun.nio.ch.EPollSelectorImpl)
        在 sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
        在 org.apache.tomcat.util.net.NioBlockingSelector$BlockPoller.run(NioBlockingSelector.java:298)

    「服務執行緒」 #9 守護程式 prio=9 os_prio=0 tid=0x00007fe848102800 nid=0x1902 可執行 [0x00000000000000000]
       java.lang.Thread.State:可運行

    "C1 CompilerThread2" #8 守護程式 prio=9 os_prio=0 tid=0x00007fe8480ff800 nid=0x1901 等待條件 [0x0000000000000000]
       java.lang.Thread.State:可運行

    "C2 CompilerThread1" #7 守護程式 prio=9 os_prio=0 tid=0x00007fe8480fd800 nid=0x1900 等待條件 [0x0000000000000000]
       java.lang.Thread.State:可運行

    "C2 CompilerThread0" #6 守護程式 prio=9 os_prio=0 tid=0x00007fe8480fb000 nid=0x18ff 等待條件 [0x0000000000000000]
       java.lang.Thread.State:可運行

    「訊號調度程式」#5 守護程式 prio=9 os_prio=0 tid=0x00007fe8480f9000 nid=0x18fe 可運作 [0x00000000000000000]
       java.lang.Thread.State:可運行

    「代理鎖定線程(並發 GC)」#4 守護程式 prio=9 os_prio=0 tid=0x00007fe8480f7800 nid=0x18fd 等待條件 [0x0000000000000000]
       java.lang.Thread.State:可運行

    「終結器」 #3 守護程式 prio=8 os_prio=0 tid=0x00007fe8480c4000 nid=0x18fc 在 Object.wait() [0x00007fe821dfc000]
       java.lang.Thread.State:等待(在物件監視器上)
        在 java.lang.Object.wait(本機方法)
        在 java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
        - 鎖定(java.lang.ref.ReferenceQueue$Lock)
        在 java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
        在 java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)

    「參考處理程序」#2 守護程式 prio=10 os_prio=0 tid=0x00007fe8480bf800 nid=0x18fb in Object.wait() [0x00007fe821efd000]
       java.lang.Thread.State:等待(在物件監視器上)
        在 java.lang.Object.wait(本機方法)
        在 java.lang.Object.wait(Object.java:502)
        在 java.lang.ref.Reference.tryHandlePending(Reference.java:191)
        - 鎖定(java.lang.ref.Reference$Lock)
        在 java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)

    「main」#1 prio=5 os_prio=0 tid=0x00007fe84800b800 nid=0x18f4 等待條件 [0x00007fe8509c5000]
       java.lang.Thread.State:等待(停車)
        在 sun.misc.Unsafe.park(本機方法)
        - 停車等候(java.util.concurrent.FutureTask)
        在 java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
        在java.util.concurrent.FutureTask.awaitDone(FutureTask.java:429)
        在 java.util.concurrent.FutureTask.get(FutureTask.java:191)
        在 org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:941)
        - 鎖定(org.apache.catalina.core.StandardEngine)
        在 org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
        - 鎖定(org.apache.catalina.core.StandardEngine)
        在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        - 鎖定(org.apache.catalina.core.StandardEngine)
        在 org.apache.catalina.core.StandardService.startInternal(StandardService.java:422)
        - 鎖定(org.apache.catalina.core.StandardEngine)
        在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        - 鎖定(org.apache.catalina.core.StandardService)
        在 org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:793)
        - 鎖定(java.lang.Object)
        在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        - 鎖定(org.apache.catalina.core.StandardServer)
        在 org.apache.catalina.startup.Tomcat.start(Tomcat.java:367)
        在 app.test.server.HttpServer.startServer(HttpServer.java:107)
        在 app.test.ServerBootstrap.main(ServerBootstrap.java:27)

    “虛擬機器線程” os_prio=0 tid=0x00007fe8480b7800 nid=0x18fa 可運行

    “Gang worker#0(平行 GC 執行緒)” os_prio=0 tid=0x00007fe84801c800 nid=0x18f5 可執行

    “Gang worker#1(平行 GC 執行緒)” os_prio=0 tid=0x00007fe84801e000 nid=0x18f6 可執行

    “Gang worker#2(平行 GC 執行緒)” os_prio=0 tid=0x00007fe848020000 nid=0x18f7 可執行

    “Gang worker#3(平行 GC 執行緒)” os_prio=0 tid=0x00007fe848022000 nid=0x18f8 可執行

    “並發標記-清除GC執行緒” os_prio=0 tid=0x00007fe848065000 nid=0x18f9 可執行

    “VM 定期任務執行緒” os_prio=0 tid=0x00007fe848108000 nid=0x1903 等待條件

    JNI 全域引用:64

我發現有

  • 鎖定 <0x00000006cb0240e0> (org.apache.catalina.startup.ContextConfig)

我在「/etc/systemd/system」中的服務腳本是:

    [單元]
    描述=測試應用程式
    之後=網路.目標
    [服務]
    類型=分叉
    ExecStart=/test/app/startup.sh
    [安裝]
    WantedBy=多用戶.target

我的startup.sh腳本內容是:

      #!/bin/sh
      LIB=/測試/應用程式/lib
      CONFIG_FILE_PATH=/測試/應用程式/配置
      CP=.:$CLASSPATH
      對於 ${LIB}/*.* 中的 f;
        CP=${CP}:$f;
      完畢
      CP=${CP}:${CONFIG_FILE_PATH};

      匯出 CLASSPATH=$CP
      nohup /usr/local/jdk1.7.0_80/bin/java -classpath $CLASSPATH app.test.ServerBootstrap ${CONFIG_FILE_PATH} >> test.out 2>&1 &

當我運行“startup.sh”腳本時,沒有問題。當我使用“systemctl”命令時,程式將暫停,但進程將繼續運行。

我該如何處理這個問題。執行 shell 腳本和「systemctl」指令有什麼不同嗎?

相關內容