alibek Posted December 30, 2013 · Report post Есть сервер 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
vlad11 Posted December 30, 2013 (edited) · Report post Откройте для себя monit. Затем используйте service mongod stop вместо killall mongod (хотя я не понимаю, зачем стопать, если проблема в Яве?) И, наконец, напишите скрипт сервиса для вашего приложения Java, я в свое время за полчаса переделал под свое приложение. Edited December 30, 2013 by vlad11 Share this post Link to post Share on other sites
alibek Posted December 30, 2013 · Report post monit изучу. service mongod не в тему, это не системный сервис, его из своих потрохов стартует контроллер UniFi. Что подразумевается под скриптом сервиса? Стартер rc.d или стартер для jar? Если первое, то пока необходимости нет, если второе, то unifi.sh оно и есть. Share this post Link to post Share on other sites
vlad11 Posted December 30, 2013 · Report post service mongod не в тему, это не системный сервис, его из своих потрохов стартует контроллер UniFi. Вот поэтому и странно, когда в портах есть база Mongodb. Можно из портов поставить софт и выкинуть mongod неизвестного происхожения (бинарный blob). Что подразумевается под скриптом сервиса? Стартер rc.d или стартер для jar? Если первое, то пока необходимости нет, если второе, то unifi.sh оно и есть. man rc Своими словами: Скрипт сервиса - корректный старт приложения, формирование pid файла для мониторинга работы и корректный финиш процесса. В вашем случае - грязный хак по запуску набора приложений без должного контроля взаимной работы. Share this post Link to post Share on other sites