Возможно, ваша проблема вызвана соединением в состоянии 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 время для запуска службы (в противном случае служба может быть запущена два раза, что может привести к тому же сообщению об ошибке, что и в вашем вопросе ...)