2016-02-22 46 views
1

我目前有一個python腳本,可以在大型網絡中完成非常有用的任務。我所做的是使用lsof -iTCP -F和其他一些選項來轉儲所有偵聽的TCP套接字。我能夠得到argv [0],這不是問題。但爲了獲得完整的argv值,我需要運行一個ps,並將這些PID映射在一起,然後將ps中的完整argv值合併到由lsof創建的記錄中。這感覺不必要的複雜,對於超過10000個主機,在Python中,合併這些數據的速度非常慢。有沒有什麼辦法可以讓lsof顯示整個argv數組,而不僅僅是argv [0]

有沒有什麼方法可以顯示完整的argv值w/lsof?我已閱讀手冊,但找不到任何內容,因此我不太樂觀,有任何方法可以做到這一點。當然,我可以爲lsof寫一個補丁,但是我不得不將它部署到10000多個系統,而且這是一個非啓動器。另外,如果有人有任何聰明的方法來處理Python中的處理,使得它不需要10分鐘來合併數據,我很想知道。目前,我將所有lsof和ps數據加載到密鑰(ip,pid)的字典中,然後合併它們。然後,我使用合併字典中的數據(密鑰爲(ip,port))創建一個新的字典。這很慢,因爲前兩個進程需要迭代所有lsof數據。這可能不是問題,但我想我會把它扔在這裏。我現在唯一的想法是計算處理器並生成N個子進程,每個子進程都有一個要解析的數據塊,然後將它們全部返回給父進程。

回答

0

如果您知道進程的PID(例如12345),則可以通過讀取特殊文件/proc/12345/cmdline來確定整個argv數組。它包含由NUL(\ 0)字符分隔的argv數組。

+0

對,或者我可以運行ps ..我的意思是隻使用一個lsof的調用。看起來答案是否定的。 – adam

+0

啊,我明白了。我不認爲這是支持的,但閱讀cmdline文件至少應該比調用n個獨立的'ps'進程更快。 – BingsF

相關問題