代码之家  ›  专栏  ›  技术社区  ›  Russ Chris

在python中,有没有一种跨平台的方法来确定哪个进程在监听给定的端口?

  •  2
  • Russ Chris  · 技术社区  · 15 年前

    在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-一 开关,输出如下所示(在启动打开监听端口1234的TCP套接字的python进程之后):

    $ lsof -i :1234
    COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
    python  22380 russ   15u  IPv4 4015476      0t0  TCP *:1234 (LISTEN)
    
    3 回复  |  直到 15 年前
        1
  •  2
  •   Daenyth    15 年前

    这个答案更接近你的问题,但是如果你能找到操作系统特有的方法,但是没有严格的可移植性,我会让你的模块如下

    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)
    
        2
  •  2
  •   Russ Chris    15 年前

    不,这不是python内置的。

        3
  •  2
  •   Community Mohan Dere    9 年前

    就像 Daenyth's anwer ,这并不能准确地回答您提出的问题,但我认为您可能会发现这很有帮助,因为答案似乎是“您不能”。

    嗯,NT's 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中使用一个非管理员帐户。这并不像你想象的那么容易,但也不像你想象的那么难。)

        4
  •  0
  •   Shayan    6 年前

    以下代码将帮助您检索在特定端口上运行的进程的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)
    
    推荐文章