Linux

我們可以在同一台機器上找出伺服器/守護程序和客戶端程序嗎?

  • September 12, 2020

在 Ubuntu 上,我經常在本地執行一些伺服器/守護程序和一些客戶端。伺服器/守護程序和客戶端可以是任意程序(emacs 守護程序和客戶端,Screen 守護程序和客戶端,有人編寫的伺服器和客戶端),並且假設您不知道它們是如何命名的。

  • 僅給定客戶端程序的 PID,是否有某種方法可以找到伺服器/守護程序的 PID?
  • 僅給定伺服器/守護程序的 PID,是否有某種方法可以找到所有客戶端的 PID?

如果我要問的是不可能的,那麼您需要什麼額外的最少資訊才能實現盡可能通用的目標?

謝謝。

大多數形式的 IPC(程序間通信)都可以通過一些實用程序進行跟踪。套接字(網路和 UNIX 套接字)非常常用,可以使用一些常用工具進行跟踪。讓我們看一個例子netstat -ap

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:5000          0.0.0.0:*               LISTEN      810/python3         
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      858/nginx: master process 
<snip>
tcp        0      0 127.0.0.1:46858         127.0.0.1:5000          ESTABLISHED 860/nginx: worker process
<snip> 
tcp        0      0 127.0.0.1:5000          127.0.0.1:46858         ESTABLISHED 810/python3         

PID 為 860 和 810 的兩個程序正在通信;在這種情況下,810 是伺服器。我們可以通過視覺解析netstat輸出或grep為它看到這一點。

另外,假設我們想看看客戶在用 PID 810 談論什麼,我們可以這樣做lsof -p 810

COMMAND PID USER   FD      TYPE             DEVICE  SIZE/OFF    NODE NAME
<snip>
python3 810 user    8u     IPv4              35702       0t0     TCP 127.0.0.1:5000 (LISTEN)
python3 810 user   10u     IPv4            4682120       0t0     TCP 127.0.0.1:5000->127.0.0.1:46858 (ESTABLISHED)

在這裡,我們可以辨識與我們的程序通信的端點,但不能辨識 PID。要辨識另一個 PID,我們可以這樣做lsof -i :46858

COMMAND PID  USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
python3 810  user   10u  IPv4 4682120      0t0  TCP localhost:5000->localhost:46858 (ESTABLISHED)
nginx   860 nginx   18u  IPv4 4681280      0t0  TCP localhost:46858->localhost:5000 (ESTABLISHED)

輸出的更下方netstat是 UNIX 套接字:

Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node   PID/Program name     Path
<snip>
unix  2      [ ACC ]     STREAM     LISTENING     21936    1/systemd            /run/dbus/system_bus_socket
<snip>
unix  3      [ ]         STREAM     CONNECTED     28918    648/dbus-daemon      /run/dbus/system_bus_socket

我們可以看到這兩個程序都在使用 UNIX 套接字/run/dbus/system_bus_socket。所以如果你知道其中一個過程,看著這個,你應該能夠確定另一端。lsof在這種情況下可以再次使用,也可以指向套接字文件,如lsof /run/dbus/system_bus_socket.

我意識到這有點令人費解而且有點複雜,但我希望它有所幫助。請注意,使用某種文件/句柄(例如管道)的其他類型的 IPC 也可以使用進行跟踪lsof

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