在Python 3中给出一个套接字和inode的进程ID

/ proc / net / tcp给我一个套接字的本地地址,端口和inode号码(例如0.0.0.0:5432和9289)。

鉴于上述信息,我想find特定进程的PID。

可以打开/ proc中的每个编号文件夹,然后使用诸如“$ sudo ls -l / proc / * / fd / 2> / dev / null | grep socket”等shell命令检查符号链接是否匹配套接字/ inode编号。 但是,这似乎在计算上比所需的更昂贵,因为任何给定系统上的进程的<5%都具有开放的TCP套接字。

find已打开给定套接字的PID的最有效方法是什么? 我宁愿使用标准库,而我目前正在用Python 3.2.3进行开发。

编辑:从问题中删除代码示例,因为它们现在包含在下面的答案中。

Solutions Collecting From Web of "在Python 3中给出一个套接字和inode的进程ID"

我不知道如何在Python中做到这一点,但你可以使用lsof(1)

 lsof -i | awk -v sock=158384387 '$6 == sock{print $2}' 

158384387是socket的inode。 然后使用subprocess.Popen从python调用它。

你将不得不使用sudo(8)如果你想看到别人插座,然后你自己的。

以下代码完成了原始目标:

 def find_pid(inode): # get a list of all files and directories in /proc procFiles = os.listdir("/proc/") # remove the pid of the current python process procFiles.remove(str(os.getpid())) # set up a list object to store valid pids pids = [] for f in procFiles: try: # convert the filename to an integer and back, saving the result to a list integer = int(f) pids.append(str(integer)) except ValueError: # if the filename doesn't convert to an integer, it's not a pid, and we don't care about it pass for pid in pids: # check the fd directory for socket information fds = os.listdir("/proc/%s/fd/" % pid) for fd in fds: # save the pid for sockets matching our inode if ('socket:[%d]' % inode) == os.readlink("/proc/%s/fd/%s" % (pid, fd)): return pid