2010-10-06 36 views
1

在linux中,我可以在下面的函數中使用lsof -i爲:在python中是否有跨平臺的方式來確定哪個進程正在偵聽給定的端口?

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 
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME 
python 22380 russ 15u IPv4 4015476  0t0 TCP *:1234 (LISTEN) 
+2

請參閱:http://stackoverflow.com/questions/ 15708/lsof的等價換窗戶。他們談論文件,但它不太可能讓端口更容易。 – tokland 2010-10-06 16:13:31

+1

@tokland:謝謝。但我正在尋找一種不需要安裝特定於操作系統的非Python包的方法。我同意它可能不太可能在Windows上,但我仍然需要問。無論如何,鏈接到引用sysinternals的東西......當在Windows中這些工具是不可或缺的。 – Russ 2010-10-06 16:51:30

回答

2

不,這不是內置PYT提問。

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) 
+0

絕對是切線,但謝謝!我正在尋找一種跨平臺的方式來做到這一點,解決方案最好不是「弄清楚如何在每個平臺上做到這一點,並根據os.name或sys.platform在代碼中調用調用」。儘管如此,所有這一切都是可行的,那麼就這樣吧。 – Russ 2010-10-06 17:17:00

+0

雖然有時候這真的是答案。例如,在這種情況下。 – SamB 2011-10-10 17:20:39

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中使用的是非管理員帳戶,雖然不像應該那麼容易,但也不像您想象的那麼容易。)

相關問題