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、出力は次のようになります (ポート 1234 でリッスンする TCP ソケットを開く Python プロセスを起動した後):

$ lsof -i:1234
コマンド PID ユーザー FD タイプ デバイス サイズ/オフ ノード名
python 22380 russ 15u IPv4 4015476 0t0 TCP *:1234 (リッスン)
4

4 に答える 4

2

この答えはあなたの質問にもっと接していますが、OS固有の方法を見つけることができても厳密に移植できるものがない場合は、モジュールを次のようにします

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

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 によって必要なアクセスが許可されているすべてのプロセスに対してこれを行うことが許可されている可能性がありますが、実際には、管理者以外のユーザーの「私のプロセス」と基本的に同じことを意味します。)

Explorer の [プロパティ] ダイアログからコピーした の正確なバージョンはnetstat.exe、「5.1.2600.5512 (xpsp.080413-0852)」です。たまたま XP SP3 を実行していましたが、このファイルが最後に更新されたのはいつかはわかりません。(はい、XP で管理者以外のアカウントを使用しています。思ったほど簡単ではありませんが、思ったほど難しくもありません。)

于 2011-10-10T18:13:23.897 に答える
2

いいえ、これは Python には組み込まれていません。

于 2010-11-30T14:58:32.213 に答える
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 に答える