Linux
我們可以在同一台機器上找出伺服器/守護程序和客戶端程序嗎?
在 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
。