如何检查套接字是否正在侦听?

iro*_*and 6 socket ss

我想定期观察一个套接字状态,所以我需要通过命令检查套接字状态。

目前我列出了所有侦听套接字ss并通过grep.

ss -l | grep -q /run/php/php7.0-fpm.sock
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来检查套接字的状态?

Kam*_*ski 6

在断开连接之前,您可以通过尝试连接、不传递任何内容和不接受任何内容来获取一些信息。

socat -u OPEN:/dev/null UNIX-CONNECT:/run/php/php7.0-fpm.sock
Run Code Online (Sandbox Code Playgroud)

至少有四种可能的结果:

  • 如果套接字不存在,则错误为No such file or directory,退出状态为1

  • 如果您没有对套接字的写访问权限,则错误将为Permission denied,退出状态将为1。在这种情况下,您无法判断是否有进程在监听。

  • 如果您对套接字具有写访问权限并且没有侦听进程,那么错误将是Connection refused,退出状态将是1.

  • 如果您对套接字具有写访问权限并且有进程在侦听,则将建立连接。该命令不会发送任何内容(例如cat /dev/null),它不会尝试接收任何内容(因为-u),因此它几乎会立即退出。退出状态将为0

    连接建立,虽然短暂但仍然如此。监听进程可以配置为只接受一个连接,服务它并退出;或一次接受一个连接。在这种情况下,探测连接将达到极限;这是不可取的。然而,在实践中,我希望绝大多数侦听进程能够为多个连接提供服务,并优雅地处理无情断开连接的客户端。

笔记:

  • 您需要解析 stderr 以区分生成 exit status 的情况1
  • 该过程没有说明正在侦听的进程。