Jump to content
Калькуляторы

Перезапуск приложения из cron-а не всегда срабатывает, нет предположений почему?

Есть сервер FreeBSD 8.2 x64.

Сервер работает контроллером для хотспота UniFi.

Раньше на сервере была версия 2.3.3, работала как часы.

Затем я обновил до 2.4.6, некоторое время работало нормально, но затем начало вылетать.

Вылет заключается в том, что через несколько часов работы (иногда через 4, иногда через 20) перестает отвечать веб-интерфейс админ-панели. В логах в этот момент сообщения об ошибках — различные исключения и нехватка памяти. Заводил тему на форуме Ubiquiti, но без ответа.

Если культурно прибить процесс java (через TERM, а не KILL), то она очень долго закрывается (минуты две-три), грузит при этом CPU на 100% и не закрывает mongod. Из-за этого впоследствии она не рестартится, нужно вручную прибить также процесс mongod.

Чтобы временно решить проблему, завел такой костыль:

killall mongod && killall -KILL java && sleep 1 && rm nohup.out && ./unifi.sh start

При выполнении этих команд контроллер успешно рестартует (в unifi.sh просто вызов ява-приложения через nohup).

Но когда я эту же команду оформляю с cron, то получаю странный результат:

#!/bin/sh

cd /data/hotspot/UniFi
CLOCK=`date +"%Y-%m-%d %H:%M:%S"`

if [ -f nohup.out ]
then
       if [ -s nohup.out ]
       then
               echo "$CLOCK - unifi hang, force restart" >> unifi-restart.log
               killall mongod
               sleep 1
               killall -KILL java
               sleep 1
               rm nohup.out
               sleep 1
               ./unifi.sh start
       else
               echo "$CLOCK - unifi ok, continue" >> unifi-restart.log
       fi
else
       echo "$CLOCK - unifi crash, starting" >> unifi-restart.log
       killall mongod
       sleep 1
       killall -KILL java
       sleep 1
       rm nohup.out
       sleep 1
       touch nohup.out
       ./unifi.sh start
fi

 

В теории, этот скрипт, запускаемый каждый час, должен проверять на наличие файл nohup.out.

Если файла по какой-то причине нет, то он стартует контроллер.

Если файл есть и он не пустой (а без ошибок в логи ничего не идет), то сервисы рестартятся.

Если файл есть и он пустой, то все хорошо.

Если скрипт запускать вручную, то он всегда именно так и работает.

Но когда скрипт запускается через планировщик, иногда файл nohup.out не создается (хотя процессы есть). Иногда создается, но процессов нет (видимо они завершаются аварийно).

 

Не подскажите, как подправить скрипт, чтобы работал всегда?

Share this post


Link to post
Share on other sites

Откройте для себя monit.

Затем используйте service mongod stop вместо killall mongod (хотя я не понимаю, зачем стопать, если проблема в Яве?)

И, наконец, напишите скрипт сервиса для вашего приложения Java, я в свое время за полчаса переделал под свое приложение.

Edited by vlad11

Share this post


Link to post
Share on other sites

monit изучу.

service mongod не в тему, это не системный сервис, его из своих потрохов стартует контроллер UniFi.

Что подразумевается под скриптом сервиса? Стартер rc.d или стартер для jar? Если первое, то пока необходимости нет, если второе, то unifi.sh оно и есть.

Share this post


Link to post
Share on other sites

service mongod не в тему, это не системный сервис, его из своих потрохов стартует контроллер UniFi.

Вот поэтому и странно, когда в портах есть база Mongodb. Можно из портов поставить софт и выкинуть mongod неизвестного происхожения (бинарный blob).

 

Что подразумевается под скриптом сервиса? Стартер rc.d или стартер для jar? Если первое, то пока необходимости нет, если второе, то unifi.sh оно и есть.

man rc

Своими словами: Скрипт сервиса - корректный старт приложения, формирование pid файла для мониторинга работы и корректный финиш процесса.

 

В вашем случае - грязный хак по запуску набора приложений без должного контроля взаимной работы.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this