Проблема с сокетом в Debian 9 - Как использовать скрипт bash для проверки - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть служба в Debian 9. У меня также есть перезапуск bash, поэтому, если служба неожиданно завершает работу, она перезапустится.

Рестартер в основном делает:

if (this service is not running); then
  run service
fi

Проблема, с которой я столкнулся, заключается в том, что иногда, после непредвиденного завершения работы службы, перезапуск снова запускает ее, но я получаю сообщение об ошибке:

не удалось связать сокет-акцептор

Служба работает, но не работает.

Что можно добавить на мой перезапуск, чтобы он сначала проверял наличие сокета, а затем запустил службу? Я пробую много вещей, размещенных здесь, но пока ничего не работает.

1 Ответ

0 голосов
/ 16 сентября 2018

Возможно, ваша проблема вызвана соединением в состоянии TIME_WAIT (см., Например, здесь ).

Вы можете избежать этой проблемы, используя SO_REUSEADDR в приложении.

Если вы не можете изменить приложение, вам придется проверить это условие в restarter и отложить запуск службы до исчезновения соединения TIME_WAIT.

Эту проверку можно выполнить, проанализировав вывод netstat, например ::

while netstat -n | egrep ':5678.*:.*TIME_WAIT' >/dev/null ; do sleep 0.1 ; done

Где 5678 - номер вашего сервисного порта.

Удачи!

РЕДАКТИРОВАТЬ> Перезапустить фрагмент с чеком:

pidof service >/dev/null
PID1=$?
if [ $PID1 -eq 1 ] ; then
    while netstat -n | egrep ':5678.*:.*TIME_WAIT' >/dev/null ; do sleep 1 ; done
    screen -A -dmS service1 gdb --batch -x /home/server/crashreport.gdb /home/server/bin/service
fi

Обратите внимание, что возможна более короткая форма:

if ! pidof service >/dev/null ; then
    while netstat -n | egrep ':5678.*:.*TIME_WAIT' >/dev/null ; do sleep 1 ; done
    screen -A -dmS service1 gdb --batch -x /home/server/crashreport.gdb /home/server/bin/service
fi

Если ваш перезапуск запускает эту проверку в цикле, вы должны дать screen и gdb время для запуска службы (в противном случае служба может быть запущена два раза, что может привести к тому же сообщению об ошибке, что и в вашем вопросе ...)

...