在python中是否有一种跨平台的方法来确定哪个进程正在侦听给定端口?

时间:2010-10-06 16:00:21

标签: python tcp cross-platform pid

在linux中,我可以使用lsof -i,如下面的函数所示:

def FindProcessUsingPort(portnum):
    import os
    fp = os.popen("lsof -i :%s" % portnum)
    lines = fp.readlines()
    fp.close()
    pid = None
    if len(lines) >= 2:
        pid = int(lines[1].split()[1])
    return pid

有没有跨平台的方式来解决这个问题?

作为相关参考,一旦我知道了进程ID,psutil库就非常好了,让我以跨平台的方式为它确定各种有用的进程信息。我现在无法让第一部分工作(找到pid)跨平台。


如果不熟悉lsof -i开关,输出如下所示(启动python进程后打开侦听端口1234的TCP套接字):

$ lsof -i :1234
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
python  22380 russ   15u  IPv4 4015476      0t0  TCP *:1234 (LISTEN)

4 个答案:

答案 0 :(得分:2)

这个答案更像是你问题的答案,但是如果你能找到特定于操作系统的方法,但没有严格的便携,我会把你的模块设为如下

def find_port_owner_windows(p):
    doit()

def find_port_owner_linux(p):
    doit2()

port_finders = {'nt': find_port_owner_windows,
                'posix': find_port_owner_linux}

try:
    find_port_owner = port_finders[os.name]
except KeyError:
    raise RuntimeError("No known port finder for your OS (%s)" % os.name)

答案 1 :(得分:2)

不,这不是内置于python中的。

答案 2 :(得分:2)

Daenyth's anwer一样,这并没有准确回答你提出的问题,但我认为你可能会发现它有用,因为答案似乎是“你不能”。

嗯,NT的netstat.exe可能没有那么强大,但它至少可以做到这一点:

C:\Documents and Settings\Sam\My Documents>netstat -o -b -n

Active Connections

  Proto  Local Address          Foreign Address        State           PID
  TCP    127.0.0.1:1083         127.0.0.1:6000         ESTABLISHED     3716
  [Xming.exe]

  TCP    127.0.0.1:1084         127.0.0.1:6000         ESTABLISHED     3716
  [Xming.exe]

  TCP    127.0.0.1:1085         127.0.0.1:6000         ESTABLISHED     3716
  [Xming.exe]

  TCP    127.0.0.1:1214         127.0.0.1:9481         ESTABLISHED     236
  Can not obtain ownership information
  TCP    127.0.0.1:1231         127.0.0.1:31416        ESTABLISHED     2764
  [boincmgr.exe]

  TCP    127.0.0.1:3814         127.0.0.1:6000         ESTABLISHED     716
  [putty.exe]

“无法获取所有权信息”行是因为我不是以管理员身份运行它,所以(就像在Linux上一样)我真的只能看到我自己的进程的这个信息。 (我实际上可能允许为ACL授予我必要访问权限的任何进程执行此操作,但在实践中,这意味着与非管理员用户的“我的进程”基本相同。)

从资源管理器的“属性”对话框中复制的netstat.exe的确切版本为“5.1.2600.5512(xpsp.080413-0852)”。我碰巧运行的是XP SP3,但我不确定这个文件最后一次更新的时间。 (是的,我在XP中使用非管理员帐户。它并不像它应该的那样容易,但它也没有你想象的那么难。)

答案 3 :(得分:0)

以下代码将帮助您检索在特定端口上运行的进程的PID。在这种情况下为5556。

import subprocess
import re

port = 5556
data = subprocess.check_output(['lsof', '-i:{}'.format(port)]).decode().split('\n')[1]
pid = re.match('^([a-zA-Z0-9]+)(\s+)([0-9]+)\s', data).groups()[2]
print(pid)