发现在Python 3给定的插座和inode进程ID(Finding a process ID gi

2019-07-19 04:48发布

的/ 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发展。

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

Answer 1:

下面的代码完成原来的目标:

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


Answer 2:

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

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

158384387是套接字索引节点。 然后使用从蟒蛇调用它subprocess.Popen

你将不得不如果你想查看其他用户打开插座使用sudo(8)。



文章来源: Finding a process ID given a socket and inode in Python 3