ironsand Asked: 2019-12-12 08:33:09 +0800 CST2019-12-12 08:33:09 +0800 CST 2019-12-12 08:33:09 +0800 CST 如何检查套接字是否正在侦听? 772 我想定期观察一个套接字状态,所以我需要通过命令检查套接字状态。 目前,我列出了所有监听套接字ss并按grep. ss -l | grep -q /run/php/php7.0-fpm.sock 有没有更好的方法来检查套接字的状态? socket ss 3 个回答 Voted Best Answer Kamil Maciorowski 2019-12-12T14:57:08+08:002019-12-12T14:57:08+08:00 您可以通过尝试连接来获取一些信息,在断开连接之前不传递任何内容并且不接受任何内容。 socat -u OPEN:/dev/null UNIX-CONNECT:/run/php/php7.0-fpm.sock 至少有四种可能的结果: 如果套接字不存在,则错误将是No such file or directory并且退出状态将是1。 如果您没有对套接字的写访问权限,则错误将是Permission denied并且退出状态将是1. 在这种情况下,您无法判断是否有进程正在侦听。 如果您对套接字具有写访问权限并且没有侦听进程,则错误将是Connection refused并且退出状态将是1。 如果您对套接字具有写访问权并且有一个进程正在侦听,那么将建立连接。该命令不会发送任何内容(例如cat /dev/null),也不会尝试接收任何内容(因为-u),因此它几乎会立即退出。退出状态将是0。 连接建立起来,短暂但仍然。监听进程可以配置为只接受一个连接,服务它并退出;或一次接受一个连接。在这种情况下,探测连接将达到极限;这是不可取的。然而在实践中,我希望绝大多数监听进程能够服务于多个连接并优雅地处理那些无情地断开连接的客户。 笔记: 您需要解析 stderr 以区分生成退出状态的案例1。 该过程没有说明正在侦听的进程。 mosvy 2019-12-15T20:36:33+08:002019-12-15T20:36:33+08:00 您可以通过设备和 inode 号匹配它: ss -elx | grep -w "$(stat -c 'ino:%i dev:0/%d' /run/php/php7.0-fpm.sock)" 如果您只关心它的退出状态(如果有进程正在侦听该文件,则为 0 = 成功),请提供-q选项。grep 请参阅相关答案和从那里链接的答案以获取解释和陷阱,尤其是有关返回的设备编号的错误格式的部分ss。 尝试连接到套接字以确定是否有东西在监听它就像咬人看他们是否还活着;-) Hopping Bunny 2019-12-18T20:22:24+08:002019-12-18T20:22:24+08:00 如果您只是想检查端口是否打开,我会建议像这样使用 telnet: telnet localhost <port> 但是,您似乎想编写脚本并定期检查。除了上面的优秀答案之外,这里还有一个关于如何做到这一点的例子。 我感谢Chuss的 SE 帖子,并添加了一些关于它如何工作的信息。 host=localhost; port=222 r=$(bash -c 'exec 3<> /dev/tcp/'$host'/'$port';echo $?' 2>/dev/null) if [ "$r" = "0" ]; then echo "$host $port is open"; else echo "$host $port is closed"; fi 以下是解释的行: bash -c在空环境中执行命令。 exec 3<> /dev/tcp/'$host'/'$port'打开 /dev/tcp/'$host'/'$port' 进行读写。 echo $?记录最后一条命令的退出码(0或非零);变量“r”得到这个值。 现在我们有了变量 $r,它可以是 0(打开)或非零(关闭)。基于此,您可以执行诸如回显结果、写入日志文件或通过电子邮件发送输出等操作。您可以将其作为 cron 作业运行。 HTH。
您可以通过尝试连接来获取一些信息,在断开连接之前不传递任何内容并且不接受任何内容。
至少有四种可能的结果:
如果套接字不存在,则错误将是
No such file or directory
并且退出状态将是1
。如果您没有对套接字的写访问权限,则错误将是
Permission denied
并且退出状态将是1
. 在这种情况下,您无法判断是否有进程正在侦听。如果您对套接字具有写访问权限并且没有侦听进程,则错误将是
Connection refused
并且退出状态将是1
。如果您对套接字具有写访问权并且有一个进程正在侦听,那么将建立连接。该命令不会发送任何内容(例如
cat /dev/null
),也不会尝试接收任何内容(因为-u
),因此它几乎会立即退出。退出状态将是0
。连接建立起来,短暂但仍然。监听进程可以配置为只接受一个连接,服务它并退出;或一次接受一个连接。在这种情况下,探测连接将达到极限;这是不可取的。然而在实践中,我希望绝大多数监听进程能够服务于多个连接并优雅地处理那些无情地断开连接的客户。
笔记:
1
。您可以通过设备和 inode 号匹配它:
如果您只关心它的退出状态(如果有进程正在侦听该文件,则为 0 = 成功),请提供
-q
选项。grep
请参阅相关答案和从那里链接的答案以获取解释和陷阱,尤其是有关返回的设备编号的错误格式的部分
ss
。尝试连接到套接字以确定是否有东西在监听它就像咬人看他们是否还活着;-)
如果您只是想检查端口是否打开,我会建议像这样使用 telnet:
telnet localhost <port>
但是,您似乎想编写脚本并定期检查。除了上面的优秀答案之外,这里还有一个关于如何做到这一点的例子。
我感谢Chuss的 SE 帖子,并添加了一些关于它如何工作的信息。
以下是解释的行:
bash -c
在空环境中执行命令。exec 3<> /dev/tcp/'$host'/'$port'
打开 /dev/tcp/'$host'/'$port' 进行读写。echo $?
记录最后一条命令的退出码(0或非零);变量“r”得到这个值。现在我们有了变量 $r,它可以是 0(打开)或非零(关闭)。基于此,您可以执行诸如回显结果、写入日志文件或通过电子邮件发送输出等操作。您可以将其作为 cron 作业运行。
HTH。