在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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句