我在 AIX(7.1) 操作系统中设置了一个 crontab,每 8 小时执行一次 java 服务。一旦 crontab 完成任务,JAVA 服务就应该结束。这个 cronjob 运行正常。但 java 服务在结束时并没有关闭其会话。此外,这个 java 服务需要 3-4 小时来处理文件。
Java 会话日渐累积,最终导致应用服务器闲置。
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
捕获应用程序发出的系统调用 - 它也可以告诉您它在做什么。