![AIX 서버에서 cronjob이 실행된 후에도 이 Java 프로세스가 종료되지 않는 이유는 무엇입니까?](https://rvso.com/image/776326/AIX%20%EC%84%9C%EB%B2%84%EC%97%90%EC%84%9C%20cronjob%EC%9D%B4%20%EC%8B%A4%ED%96%89%EB%90%9C%20%ED%9B%84%EC%97%90%EB%8F%84%20%EC%9D%B4%20Java%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EA%B0%80%20%EC%A2%85%EB%A3%8C%EB%90%98%EC%A7%80%20%EC%95%8A%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
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
또한 앱에서 수행된 시스템 호출을 캡처해 볼 수도 있습니다 . 이를 통해 앱이 수행하는 작업도 알 수 있습니다.