2

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

$ lsof -i :1234
命令 PID 用户 FD 类型 设备尺寸/关闭节点名称
python 22380 russ 15u IPv4 4015476 0t0 TCP *:1234 (LISTEN)
4

4 回答 4

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)
于 2010-10-06T16:10:17.743 回答
2

不,这不是python内置的。

于 2010-11-30T14:58:32.213 回答
2

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

嗯,NTnetstat.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 中使用的是非管理员帐户。这并不像应该的那么容易,但也没有你想象的那么难。)

于 2011-10-10T18:13:23.897 回答
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)
于 2019-11-13T19:01:46.317 回答