Задать вопрос
Snowindy
@Snowindy

Неожиданное завершение процесса, запущенного через nohup?

Ситуация:

Есть веб-сервер, процесс которого может самопроизвольно завершиться (ошибка, OutOfMemory, что угодно).


Для того, чтобы сервер поднимался автоматически после падения, написал специальный скрипт:

run-loop.sh
while :
do
echo "inifinite loop iteration..."
./start-server.sh
echo "inifinite loop iteration ended, sleeping for some time"
sleep 60
done



Запускаю все дело так из сессии ssh специального пользователя (не root):
nohup ./run-loop.sh > logs/server-out.log &


Скрипт-враппер работает нормально в тестах, проверял: если убить процесс сервера через kill -9, он поднимается через минуту.


Тем не менее, периодически (время плавает, 1-7 суток нормальной работы обычно) обнаруживаю, что нет ни одного из процессов пользователя: ни процесса враппера с циклом, ни процесса сервера.

В логах сервера ничего нет полезного, как будто его штатно выключили, в server-out.log тоже ничего.


Как понять, кто убил процессы пользователя? Может ли сервер завершаться с каким-то особым кодом ошибки, вырубающим все скрипты по цепочке? Где искать логи и концы?


Uptime говорит, что железный сервер не перезагружали.

Операционная система: FreeBSD 9.x.

UPDATE:

Убрал враппер, реализовал проверку сервиса через cron, работает.
  • Вопрос задан
  • 3978 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 1
xenon
@xenon
Too drunk to fsck
Немного смущает строчка про OutOfMemory. Это просто для примера написано, или на самом деле такая ошибка иногда случается? Просто на линуксе, когда случается, это плохо, и чтобы хоть как-то система жила, ядро прибивает «кого попало», случайный процесс. Так что, если во фре подобная же схема — может быть по этой же причине сам шелл-скрипт убивается? В логах, наверное, OOM должен отражаться.

Но как вариант, если цель не разобраться, а просто решить проблему, лишь бы работало — можно попробовать без враппера. Просто по крону запускать простенький «чек-респаун» скрипт, который будет проверять, и если сервер лежит (по лок-файлу, открытому порту или даже тупо по ps'у) — запускать его снова. В этом случае уже скрипт не умрет по непонятной причине. Разве что умрет cron от ООМа, но если cron умрет — уже точно будете знать, что проблема не в кривом коде крона.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
jj_killer
@jj_killer
Есть такой вариант: github.com/visionmedia/mon
Ответ написан
RicoX
@RicoX
Ушел на http://ru.stackoverflow.com/
Можно использовать monit
Попробуйте вручную послать SIGTERM на run-loop.sh, какова реакция? В Вашем варианте есть вертушка, перезапускающая процесс, но нет контроля работы самой вертушки, ну и не плодите велосипеды, все давно придумано (см. выше про monit)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы