Я установил crontab для выполнения службы java каждые 8 часов в операционной системе AIX(7.1). После того, как 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
Еще один быстрый способ — отправить сигнал SIGQUIT:
kill -3 <pid>
- в этом случае дамп потока будет выведен на стандартный вывод процесса
Имея дамп потока, вы можете изучить потоки приложения и увидеть, где они застряли.
Вы также можете попробовать strace
перехватить системные вызовы, выполняемые приложением, — это также может подсказать вам, что оно делает.