AIX サーバーで cronjob が実行されても、この Java プロセスが終了しないのはなぜですか?

AIX サーバーで cronjob が実行されても、この Java プロセスが終了しないのはなぜですか?

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アプリによって行われたシステムコールをキャプチャすることもできます。これにより、アプリが何を実行しているかがわかります。

関連情報