![AIX サーバーで cronjob が実行されても、この Java プロセスが終了しないのはなぜですか?](https://rvso.com/image/776326/AIX%20%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%A7%20cronjob%20%E3%81%8C%E5%AE%9F%E8%A1%8C%E3%81%95%E3%82%8C%E3%81%A6%E3%82%82%E3%80%81%E3%81%93%E3%81%AE%20Java%20%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%8C%E7%B5%82%E4%BA%86%E3%81%97%E3%81%AA%E3%81%84%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A7%E3%81%99%E3%81%8B%3F.png)
AIX(7.1) オペレーティング システムで 8 時間ごとに Java サービスを実行するための crontab を設定しました。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
もう 1 つの簡単な方法は、SIGQUIT シグナルを送信することです。
kill -3 <pid>
- この場合、スレッドダンプはプロセスの標準出力に出力されます。
スレッド ダンプがあれば、アプリケーション スレッドを調べて、どこでスタックしているかを確認できます。
strace
アプリによって行われたシステムコールをキャプチャすることもできます。これにより、アプリが何を実行しているかがわかります。