AIX 서버에서 cronjob이 실행된 후에도 이 Java 프로세스가 종료되지 않는 이유는 무엇입니까?

AIX 서버에서 cronjob이 실행된 후에도 이 Java 프로세스가 종료되지 않는 이유는 무엇입니까?

AIX(7.1) 운영 체제에서 8시간마다 Java 서비스를 실행하기 위해 crontab을 설정했습니다. crontab이 작업을 완료하면 JAVA 서비스가 종료되어야 합니다. 이 cronjob이 제대로 작동하고 있습니다. 그러나 Java 서비스는 마지막에 세션을 종료하지 않았습니다. 또한 이 Java 서비스는 파일을 처리하는 데 3~4시간이 걸립니다.

Java 세션은 날마다 누적되고 결국 애플리케이션 서버가 유휴 상태가 됩니다.

자바 버전 1.8
AIX 7.1

Crontab 항목:

00 8 * * * cd /ibl/qnb/uat/app/adm/ADM_AUTOMATE_SERV && ./RUN.sh > /ibl/qnb/uat/logs/adm/ADM_AUTOMATE_SERV/run.log

위 명령문을 수동으로 실행하면 cronjob이 제대로 실행되고 마지막에 세션이 종료됩니다.

RUN.sh 파일:

/usr/java8_64/bin/java -Xmx1024m -jar ADM_AUTOMATE_SERV.jar 

다음은 애플리케이션 서버에서 여전히 실행 중인 Java 세션입니다. 제가 뭘 잘못하고 있는지 살펴보고 조언해 주세요.

30932996  7340260   0   Mar 25      -  0:00 sh -c cd /ibl/qnb/uat/app/adm/ADM_AUTOMATE_SERV && ./RUN.sh > /ibl/qnb/uat/logs/adm/ADM_AUTOMATE_SERV/run.log
31129600 29425670  21   Mar 30      - 2953:54 /usr/java8_64/bin/java -Xmx1024m -jar ADM_AUTOMATE_SERV.jar
32505878 33620190  25 08:00:00      - 216:49 /usr/java8_64/bin/java -Xmx1024m -jar ADM_AUTOMATE_SERV.jar
32833638 40304674  25   Mar 28      - 4183:00 /usr/java8_64/bin/java -Xmx1024m -jar ADM_AUTOMATE_SERV.jar
33620190  7340260   0 08:00:00      -  0:00 sh -c cd /ibl/qnb/uat/app/adm/ADM_AUTOMATE_SERV && ./RUN.sh > /ibl/qnb/uat/logs/adm/ADM_AUTOMATE_SERV/run.log
33947736  7340260   0   Apr 04      -  0:00 sh -c cd /ibl/qnb/uat/app/adm/ADM_AUTOMATE_SERV && ./RUN.sh > /ibl/qnb/uat/logs/adm/ADM_AUTOMATE_SERV/run.log
34406468 35389628  22   Apr 03      - 965:58 /usr/java8_64/bin/java -Xmx1024m -jar ADM_AUTOMATE_SERV.jar
34471988  7340260   0   Mar 31      -  0:00 sh -c cd /ibl/qnb/uat/app/adm/ADM_AUTOMATE_SERV && ./RUN.sh > /ibl/qnb/uat/logs/adm/ADM_AUTOMATE_SERV/run.log
35389628  7340260   0   Apr 03      -  0:00 sh -c cd /ibl/qnb/uat/app/adm/ADM_AUTOMATE_SERV && ./RUN.sh > /ibl/qnb/uat/logs/adm/ADM_AUTOMATE_SERV/run.log
37290036 34471988  24   Mar 31      - 2444:53 /usr/java8_64/bin/java -Xmx1024m -jar ADM_AUTOMATE_SERV.jar
38863052  7340260   0   Apr 02      -  0:00 sh -c cd /ibl/qnb/uat/app/adm/ADM_AUTOMATE_SERV && ./RUN.sh > /ibl/qnb/uat/logs/adm/ADM_AUTOMATE_SERV/run.log
39452824 30212288  30   Mar 26      - 5463:39 /usr/java8_64/bin/java -Xmx1024m -jar ADM_AUTOMATE_SERV.jar
40304674  7340260   0   Mar 28      -  0:00 sh -c cd /ibl/qnb/uat/app/adm/ADM_AUTOMATE_SERV && ./RUN.sh > /ibl/qnb/uat/logs/adm/ADM_AUTOMATE_SERV/run.log
41484458  7340260   0   Apr 01      -  0:00 sh -c cd /ibl/qnb/uat/app/adm/ADM_AUTOMATE_SERV && ./RUN.sh > /ibl/qnb/uat/logs/adm/ADM_AUTOMATE_SERV/run.log
43188280 23003326  27   Mar 22      - 8316:22 /usr/java8_64/bin/java -Xmx1024m -jar ADM_AUTOMATE_SERV.jar
46596146 20512790  29   Mar 27      - 4821:18 /usr/java8_64/bin/java -Xmx1024m -jar ADM_AUTOMATE_SERV.jar
46792934 27132138  26   Mar 24      - 6883:58 /usr/java8_64/bin/java -Xmx1024m -jar ADM_AUTOMATE_SERV.jar
46923976 30932996  26   Mar 25      - 6177:01 /usr/java8_64/bin/java -Xmx1024m -jar ADM_AUTOMATE_SERV.jar

이 문제에 대한 귀하의 시간과 노력에 진심으로 감사드립니다.

답변1

먼저 댓글을 달았지만 제대로 된 답변을 작성하는 것이 더 의미가 있을 것 같습니다.

가장 먼저 확인해야 할 것은 로그입니다. 에 의미 있는 내용이 있습니까 run.log? (작업이 실행될 때마다 덮어쓰는 대신 해당 파일에 추가할 수도 있습니다)

그런 다음 프로세스가 실행 중인 사용자/그룹을 확인하십시오. cron에서 실행할 때와 직접 실행할 때 다른가요?

Java/JVM 앱이 멈춘 위치를 파악하는 데 매우 유용한 기술은스레드 덤프- 여러 가지 방법이 있습니다:

  • 내가 가장 좋아하는 도구는 jcmd- 간단하게 할 수 있는 것 입니다

    jcmd <pid> Thread.print > thread.$(date "+%F_%H-%M-%S").dump

  • 또 다른 빠른 방법은 SIGQUIT 신호를 보내는 것입니다.kill -3 <pid>

    • 이 경우 스레드 덤프는 프로세스의 표준 출력에 인쇄됩니다.

스레드 덤프가 있으면 애플리케이션 스레드를 검사하고 스레드가 멈춰 있는 위치를 확인할 수 있습니다.

strace또한 앱에서 수행된 시스템 호출을 캡처해 볼 수도 있습니다 . 이를 통해 앱이 수행하는 작업도 알 수 있습니다.

관련 정보