我已经设置了一个crontab,用于在AIX(7.1)操作系统中每8小时执行一次java服务。一旦crontab完成了任务,JAVA服务就应该结束了。这个职位运转正常。但是java服务没有在结束时关闭它的会话。而且,这个java服务需要3-4个小时来处理这些文件。
Java会话日积月累,最终导致应用程序服务器空闲。
Java版本1.8
AIX7.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如果手动执行上述语句,则cron作业将正常运行,并在结束时关闭会话。
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非常感谢你在这件事上的时间和努力。
发布于 2022-04-06 07:40:35
我首先做了一个评论,但我认为写一个正确的答案会更有意义。
我首先要检查的是日志:在run.log中有什么有意义的东西吗?(也许您可以追加到该文件中,而不是每次作业运行时都覆盖它)
然后检查进程正在运行的用户/组--它从cron运行时与您自己运行它时有所不同吗?
找出Java/JVM应用程序卡在哪里的一个非常有用的技术是做一个线程转储--有几种方法:
jcmd -你可以简单地做jcmd <pid> Thread.print > thread.$(date "+%F_%H-%M-%S").dumpkill -3 <pid> 有了一个线程转储,您可以检查应用程序线程并查看它们被卡在哪里。
您也可以尝试strace来捕获应用程序发出的系统调用--这也可以告诉您它在做什么。
https://serverfault.com/questions/1097895
复制相似问题