为什么 cronjob 在 AIX 服务器中执行后这个 java 进程不会结束?

为什么 cronjob 在 AIX 服务器中执行后这个 java 进程不会结束?

我在 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捕获应用程序发出的系统调用 - 它也可以告诉您它在做什么。

相关内容