В python есть кроссплатформенный способ определения того, какой процесс слушает данный порт? - PullRequest
2 голосов
/ 06 октября 2010

В 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

Есть ли кросс-платформенный способ выяснить это?

Как релевантная ссылка, когда я знаю идентификатор процесса, библиотека psutil очень полезна и позволяет мне определять все виды полезной информации о процессе для нее кросс-платформенным способом. Я просто не могу заставить первую часть работать (находя pid) кроссплатформенной в данный момент.


Если вы не знакомы с переключателем lsof -i, выходные данные выглядят следующим образом (после запуска процесса python, который открывает сокет TCP, прослушивающий порт 1234):

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

Ответы [ 3 ]

2 голосов
/ 30 ноября 2010

Нет, это не встроено в python.

2 голосов
/ 10 октября 2011

Как и Ответ Денита , это не совсем точно отвечает на вопрос, который вы задали, но я думаю, что вы, вероятно, найдете его полезным, учитывая, что ответ на этот вопрос кажется "вы не можете".

Что ж, 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. Это не так просто, как должно быть, но и не так сложно, как вы думаете.)

2 голосов
/ 06 октября 2010

Этот ответ более касателен к вашему вопросу, но если вы можете найти специфичные для ОС способы, но ничего не переносимые, я бы сделал ваш модуль похожим на следующий

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)
...