我可以找到按打開時間排序的程序正在偵聽的埠列表嗎?
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
/auditctl
with 規則(並仔細過濾!)來記錄操作,但這也有性能影響(如果您還沒有執行系統範圍auditd
,strace
只會影響受監視的程序)。當您有對等點連接時,您可以使用
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 秒後獲得第一個連接。