/proc/net/tcp爲套接字(例如,0.0.0.0:5432和9289)提供本地地址,端口和inode編號。在Python 3中查找給定套接字和inode的進程ID
鑑於上述信息,我想找到特定進程的PID。
可以打開/ proc中的每個編號文件夾,然後使用shell命令(如「$ sudo ls -l/proc/*/fd/2>/dev/null |」)檢查符號鏈接是否匹配套接字/ inode編號。 grep套接字「。但是,這似乎在計算上比所需的更昂貴,因爲任何給定系統上的進程的5%都有開放的TCP套接字。
找到打開給定套接字的PID的最有效方法是什麼?我寧願使用標準庫,而我目前正在使用Python 3.2.3進行開發。
編輯:從問題中刪除了代碼示例,因爲它們現在包含在下面的答案中。
關於標準庫,我想盡量避免使用subprocess.call或os.exec,並盡一切內部的Python工作本身。 – 5ba8cabe450348c7fbe2
讀取procfs,使用lsof或使用netstat似乎沒有多少選擇。我猜他們都是一樣的(讀取procfs)。不幸的是沒有其他的事情要做。很多類似的SO問題都有相同的答案:1. read/proc/net/tcp 2. read/proc//fd /。 –
emil
我使用os.readlink和os.listdir添加了一些工作代碼 - 沒有子進程調用。我看到的問題是,我所做的os.readlink調用遠遠超過必要的 - 大約需要600次調用才能找到大約四個打開的套接字的PID。 – 5ba8cabe450348c7fbe2