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

Как организовать перезапуск сервиса при падении?

У меня есть веб-сервис который раз в несколько дней умудряется падать. Если это произошло, меня устроит его автоматический перезапуск. Я попробовал следующее решение:
@echo off
:startover
echo (%time%) App started.
call ".\bin\server.exe"
echo (%time%) WARNING: Restarting.
goto startover


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

Как такое могло произойти не представляю. По идее если сервис падает, то он освобождает порт. Но оказалось, что по каким-то причинам он не был освобожден\был освобожден не вовремя. У кого какие есть идеи?

Как еще можно решить проблему с перезапуском?
  • Вопрос задан
  • 407 просмотров
Подписаться 2 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 2
Zoominger
@Zoominger Куратор тега Системное администрирование
System Integrator
Делал такое. Скрипт "запуск программы если она не запущена powershell" гуглится на раз-два, а прикрутить логику на корректное добитие зависшего сервиса - дело двух минут.
В общем виде:
1. Проверяем, работает ли процесс;
2. Если нет, то проверяем порт;
3. Если порт не закрыт, то просто перезапускаем сервис;
4. Если порт закрыт, то добиваем остатки сервиса и перезапускаем.
Ответ написан
Комментировать
@res2001
Developer, ex-admin
По идее если сервис падает, то он освобождает порт.

Это только по вашей идее.
На самом деле порт может быть еще какое-то время занят пока не придет пакет с установленным флагом FIN или не закончится тайм-аут ожидания такого пакета. Так работает протокол TCP.
Обычно, что бы избежать ожидания закрытия порта, порт открывают с указанием флага SO_REUSEADDR.
Возможно программа падает потому, что происходит обрыв соединения. Возможно у вас не корректно обрабатывается эта ситуация (если вообще обрабатывается).
На счет рестарта - возможно стоит оформить ваш сервис как виндовую службу, тогда за рестарт будет отвечать виндовый Service Manager. И не понадобится костыль в виде батника.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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