Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debian9上的套接字问题-如何使用bash脚本检查_Bash_Sockets_Debian - Fatal编程技术网

Debian9上的套接字问题-如何使用bash脚本检查

Debian9上的套接字问题-如何使用bash脚本检查,bash,sockets,debian,Bash,Sockets,Debian,我有Debian 9的服务。我还有一个bash重启器,因此如果服务意外关闭,重启器将使它再次运行 重启程序基本上执行以下操作: if (this service is not running); then run service fi 我遇到的问题是,有时,在服务意外关闭后,重启程序使其再次运行,但我得到错误: 绑定套接字接受程序失败 服务正在运行,但没有真正工作 我可以在重启器上添加什么,让它先检查套接字是否可用,然后运行服务?我正在尝试这里发布的很多东西,但到目前为止没有任何效果。您的

我有Debian 9的服务。我还有一个bash重启器,因此如果服务意外关闭,重启器将使它再次运行

重启程序基本上执行以下操作:

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状态几分钟。因此,重启程序速度更快,运行导致问题的服务。这个问题是这个服务的原始开放源代码中的一个公开问题,我只是在寻找一个“解决方法”,而这是固定的。谢谢你帮助一个正在学习的小人物