Systemctl 시작 내장 Tomcat 실패

Systemctl 시작 내장 Tomcat 실패

Tomcat 8.5가 내장된 Java 프로젝트가 있습니다. CentOS 7.2에서 서비스로 실행하기 위해 sytemd에 새 서비스를 추가했습니다. "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 실행 가능 [0x0000000000000000]
       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 실행 가능 [0x0000000000000000]
       java.lang.Thread.State: 실행 가능

    "대리 로커 스레드(동시 GC)" #4 데몬 prio=9 os_prio=0 tid=0x00007fe8480f7800 nid=0x18fd 조건 [0x0000000000000000]에서 대기 중
       java.lang.Thread.State: 실행 가능

    "Finalizer" #3 데몬 prio=8 os_prio=0 tid=0x00007fe8480c4000 nid=0x18fc in 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)에서

    "VM 스레드" os_prio=0 tid=0x00007fe8480b7800 nid=0x18fa 실행 가능

    "갱 워커#0(병렬 GC 스레드)" os_prio=0 tid=0x00007fe84801c800 nid=0x18f5 실행 가능

    "갱 워커#1(병렬 GC 스레드)" os_prio=0 tid=0x00007fe84801e000 nid=0x18f6 실행 가능

    "갱 워커#2(병렬 GC 스레드)" os_prio=0 tid=0x00007fe848020000 nid=0x18f7 실행 가능

    "갱 워커#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"의 내 서비스 스크립트는 다음과 같습니다.

    [단위]
    설명=테스트앱
    이후=network.target
    [서비스]
    유형=포킹
    ExecStart=/test/app/startup.sh
    [설치하다]
    WantedBy=다중 사용자.대상

내 start.sh 스크립트 내용은 다음과 같습니다.

      #!/bin/sh
      LIB=/테스트/앱/lib
      CONFIG_FILE_PATH=/test/app/config
      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" 명령을 사용하면 프로그램이 일시 중지되지만 프로세스는 계속 실행됩니다.

이 문제를 어떻게 처리할 수 있습니까? 쉘 스크립트 실행과 "systemctl" 명령 사이에 차이점이 있습니까?

관련 정보