Linux

我可以找到按打開時間排序的程序正在偵聽的埠列表嗎?

  • May 19, 2014

lsof我知道我可以使用該命令查看打開的埠列表。

我正在嘗試查看按收聽時間戳排序的結果。

該過程打開了多個(~6)埠,我懷疑該埠上的初始化/綁定順序是導致錯誤的原因。從技術上講,應該可以通過查看在 linux 系統上創建的 fd 文件的創建時間戳來找到綁定的相對時間戳。

我的問題是:是否有一個命令( netstat 或 lsof )已經這樣做了?

PS:我不想走檢查日誌的路線,因為其中一些埠是由外部jar打開的,其中的init是我們無法控制的。

(通常)不記錄此資訊。文件沒有可用的“創建時間”ctime是文件 inode/metadata 更改時間。因此,事後,通常您無法可靠地確定相對或絕對時間。

在我測試過的任何 Linux 系統(2.6.x 和 3.x)上,相關/proc條目在您查看它們之前不會被實例化,所有時間戳都設置為第一次查詢目錄的時間(即這些是在 -需要顯示目前狀態,每次任何文件句柄更改時核心都不需要更新這些)。不要忘記這些都是符號連結,時間戳獨立於目標,並且這些套接字不會“存在”在文件系統中。

$ strace -tt -f -e trace=bind,listen /usr/bin/nc -l -p 8080
13:23:23.693432 bind(3, {sa_family=AF_INET, sin_port=htons(8080), sin_addr=inet_addr(
               "0.0.0.0")},16) = 0
13:23:23.693542 listen(3, 1)            = 0

幾秒鐘後在另一個終端:

$ date;  ls -cl --full-time /proc/$(pgrep -f "^/usr/bin/nc -l -p 8080")/fd
Mon May 19 13:23:31 IST 2014
total 0
lrwx------ 1 mr users 64 2014-05-19 13:23:31.344141947 +0100 0 -> /dev/pts/206
lrwx------ 1 mr users 64 2014-05-19 13:23:31.344141947 +0100 1 -> /dev/pts/206
lrwx------ 1 mr users 64 2014-05-19 13:23:31.344141947 +0100 2 -> /dev/pts/206
lrwx------ 1 mr users 64 2014-05-19 13:23:31.344141947 +0100 3 -> socket:[206347913]

執行時,所有符號連結時間都在 8 秒後設置ls

請注意使用strace,這可能是查看相關網路操作順序的最簡單方法(儘管有輕微的性能成本)。您可能不需要或不想使用-f它,它遵循所有生成的(子)程序,它可能會使輸出混亂(如果是這樣,每個輸出行都以它的 PID 為前綴)。

下一個最簡單的方法可能是使用auditd/ auditctlwith 規則(並仔細過濾!)來記錄操作,但這也有性能影響(如果您還沒有執行系統範圍auditdstrace只會影響受監視的程序)。

當您有對等點連接時,您可以使用netstat查看連接詳細資訊(該-p選項可能很有用,因為它會顯示過程),或者使用lsof- 儘管兩者都不會顯示連接時間戳。要使用 記錄這些連接,請在選項中strace添加accept到系統呼叫列表trace=,並添加一個-T選項來為每個系統呼叫計時: accept()將(通常)阻塞,僅顯示它被呼叫的時間戳,而不是它完成的時間。-T這將允許您計算完成時間。

的額外輸出accept()如下所示:

13:25:46.022244 accept(3, {sa_family=AF_INET, sin_port=htons(57534), sin_addr=inet_addr(
               "127.0.0.1")}, [16]) = 4 <3.167477>

顯示套接字已準備好在 13:25:46 接受連接,並在 3.167 秒後獲得第一個連接。

引用自:https://serverfault.com/questions/596938