為什麼在 AIX 伺服器執行 cronjob 後,這個 java 程序不會結束?

為什麼在 AIX 伺服器執行 cronjob 後,這個 java 程序不會結束?

我設定了一個 crontab 在 AIX(7.1) 作業系統中每 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 會正常運作並最終關閉會話。

運行.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捕獲應用程式發出的系統呼叫 - 這也可以告訴您它在做什麼。

相關內容