的/ proc /净/ TCP给了我一个本地地址,端口和一个套接字索引节点号(0.0.0.0:5432和9289为例)。
我想找到一个特定的进程PID,给出了上述信息。
这是可以打开/ proc中每个编号的文件夹,然后检查符号链接与像 “$ sudo的ls -l命令的/ proc / * / FD / 2>的/ dev / null的| grep的插座” shell命令匹配的插座/ inode编号。 然而,这似乎必要以上计算上昂贵的,因为<任何给定系统上的进程的5%具有开放的TCP套接字。
什么是寻找已经开了一个给定的插座PID最有效的方法是什么? 我宁愿使用标准库,和我目前正在使用Python 3.2.3发展。
编辑:从问题中移除代码样本,因为它们现在包含在下面的答案。
下面的代码完成原来的目标:
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
我不知道如何在Python做到这一点,但你可以使用lsof(1)
lsof -i | awk -v sock=158384387 '$6 == sock{print $2}'
158384387
是套接字索引节点。 然后使用从蟒蛇调用它subprocess.Popen
。
你将不得不如果你想查看其他用户打开插座使用sudo(8)。