2010-06-07 68 views

回答

1

您可以使用netstat -lnp,最後一列將包含pid和進程名稱。在Python中,您可以解析此命令的輸出。

4

如果您不想分析像netstat或lsof這樣的程序的輸出,可以通過/ proc文件系統進行拼湊,並嘗試查找其中的文件的相關文檔。 /proc/<pid>/net/tcp可能對你特別有意思。當然,這些文件的格式可能會在內核版本之間改變,所以解析命令輸出通常被認爲更可靠。

21

有兩個部分,以我的回答:

1.獲取在外殼

在第一部分,netstat會工作的信息,但我更喜歡使用lsof,因爲它可以用於提取更豐富和簡潔的清單。確切的選項使用基於您的操作系統,內核和編譯選項可能會有所不同,但我相信你想是這樣的:

lsof -a -p23819 -i4 

哪裏23819是你所選擇的PID,以及i4表示所有的IPv4套接字(儘管您可能想要IPv6的i6,視情況而定)。從那裏,你可以通過grep管道來選擇只有監聽套接字。

lsof -a -p23819 -i4 | grep LISTEN 

(在4.82 lsof版本,您還可以使用-sTCP:LISTEN標誌,而不是grep選擇偵聽套接字,雖然此選項似乎沒有可用回到4.78版本)

2。

:從Python的

你應該能夠調用lsof和讀取輸出,從Python中,使用subprocess模塊,像這樣調用

from subprocess import Popen, PIPE 
p1 = Popen(['lsof', '-a', '-p23819', '-i4'], stdout=PIPE) 
p2 = Popen(["grep", "LISTEN"], stdin=p1.stdout, stdout=PIPE) 
output = p2.communicate()[0] 

希望這有助於!

15

您可以使用psutil

>>> import psutil 
>>> p = psutil.Process(2549) 
>>> p.name() 
'proftpd: (accepting connections)' 
>>> p.connections() 
[connection(fd=1, family=10, type=1, local_address=('::', 21), remote_address=(), status='LISTEN')] 

...若要篩選監聽套接字:

這是沒有提到
>>> [x for x in p.get_connections() if x.status == psutil.CONN_LISTEN] 
[connection(fd=1, family=10, type=1, local_address=('::', 21), remote_address=(), status='LISTEN')] 
>>> 
+0

謝謝。 psutil是一個很好的模塊。但唯一的問題是使用模塊需要先安裝它。安裝psutil需要安裝gcc和python頭文件。所以使用psutil的項目很難安裝。 – mtoloo 2011-12-22 06:25:00

+0

psutil需要gcc,因爲它包含需要編譯的C代碼。我不會說它很難安裝,特別是在Linux上。例如,在Ubuntu上,您只需「apt-get install python-dev」和「pip install psutil」即可完成。 – 2014-10-22 12:59:17

0

一件事。 python中的大多數端口應用程序都有一個命令行參數。您可以解析/ proc/pid/cmdline並解析出端口號。這避免了在具有大量連接的服務器上使用ss或netstat的大量開銷。