Socket

如何檢查套接字是否正在偵聽?

  • December 18, 2019

我想定期觀察一個套接字狀態,所以我需要通過命令檢查套接字狀態。

目前,我列出了所有監聽套接字ss並按grep.

ss -l | grep -q /run/php/php7.0-fpm.sock

有沒有更好的方法來檢查套接字的狀態?

您可以通過嘗試連接來獲取一些資訊,在斷開連接之前不傳遞任何內容並且不接受任何內容。

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
  • 該過程沒有說明正在偵聽的程序。

引用自:https://unix.stackexchange.com/questions/556748