Debian9上的套接字问题-如何使用bash脚本检查
我有Debian 9的服务。我还有一个bash重启器,因此如果服务意外关闭,重启器将使它再次运行 重启程序基本上执行以下操作:Debian9上的套接字问题-如何使用bash脚本检查,bash,sockets,debian,Bash,Sockets,Debian,我有Debian 9的服务。我还有一个bash重启器,因此如果服务意外关闭,重启器将使它再次运行 重启程序基本上执行以下操作: if (this service is not running); then run service fi 我遇到的问题是,有时,在服务意外关闭后,重启程序使其再次运行,但我得到错误: 绑定套接字接受程序失败 服务正在运行,但没有真正工作 我可以在重启器上添加什么,让它先检查套接字是否可用,然后运行服务?我正在尝试这里发布的很多东西,但到目前为止没有任何效果。您的
if (this service is not running); then
run service
fi
我遇到的问题是,有时,在服务意外关闭后,重启程序使其再次运行,但我得到错误:
绑定套接字接受程序失败
服务正在运行,但没有真正工作
我可以在重启器上添加什么,让它先检查套接字是否可用,然后运行服务?我正在尝试这里发布的很多东西,但到目前为止没有任何效果。您的问题可能是由于连接处于
TIME\u WAIT
状态(请参见示例)
您可以通过在应用程序中使用SO\u REUSEADDR
来避免此问题
如果无法更改应用程序,则必须在重新启动程序中检查此情况,并延迟服务启动,直到TIME\u 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启动服务的时间(否则服务可能会运行两次,这可能会导致与您问题中的错误消息类似的错误消息…如果您可以用最少的测试用例重现问题,那么最好的情况可能是。也就是说,创建一个。但在你的情况下,这可能是不可能的。谢谢你的回答。非常感谢!我怎样才能给你的答案打分?我是个新手here@AlejandroI. 关于这件事有一个很好的解释。如果我的回答对你有帮助,我很高兴。祝你好运我想是我干的。我有点困惑,我应该在哪里添加这一行。这是我的重启器:pidof服务>/dev/null PID1=$?如果[$PID1-eq 1],那么屏幕-A-dmS service1 gdb--batch-x/home/server/crashreport.gdb/home/server/bin/service fi我应该在哪里添加该行?@AlejandroI。我编辑了答案。你能确认一下等待时间吗?另一个可能的原因可能是您的服务运行了两次(您可以使用
pidof service
——它应该只给您一个PID进行检查)…再次非常感谢,Vip。该服务不会运行两次。我总是检查使用PS—A的服务。这个服务是用C++编写的,所以当服务达到C++错误时,它就会关闭。此时,此服务使用的套接字将处于TIME_WAIT状态几分钟。因此,重启程序速度更快,运行导致问题的服务。这个问题是这个服务的原始开放源代码中的一个公开问题,我只是在寻找一个“解决方法”,而这是固定的。谢谢你帮助一个正在学习的小人物