![為什麼在 AIX 伺服器執行 cronjob 後,這個 java 程序不會結束?](https://rvso.com/image/776326/%E7%82%BA%E4%BB%80%E9%BA%BC%E5%9C%A8%20AIX%20%E4%BC%BA%E6%9C%8D%E5%99%A8%E5%9F%B7%E8%A1%8C%20cronjob%20%E5%BE%8C%EF%BC%8C%E9%80%99%E5%80%8B%20java%20%E7%A8%8B%E5%BA%8F%E4%B8%8D%E6%9C%83%E7%B5%90%E6%9D%9F%EF%BC%9F.png)
我設定了一個 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
捕獲應用程式發出的系統呼叫 - 這也可以告訴您它在做什麼。