Перейти к содержимому
Калькуляторы

Перезапуск приложения из 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 не создается (хотя процессы есть). Иногда создается, но процессов нет (видимо они завершаются аварийно).

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Изменено пользователем vlad11

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

monit изучу.

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

 

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

man rc

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.