1. 程式人生 > 實用技巧 >Linux 環境使用 lsof 命令查詢端口占用

Linux 環境使用 lsof 命令查詢端口占用

  最近發現一個 Linux 環境中比較有用的檢視系統網路連線的命令 lsof ,這裡記錄下 lsof 命令的網路連線查詢功能(其主要原理是通過查詢與網路連線相關的檔案資訊來獲取連線資訊)。本文主要內容來自 lsof 命令的 manpage。

  lsof 命令

  lsof 命令的 -i 引數用於指定進行查詢的網路連線的引數,其形式如下所示。

    lsof -i [46][protocol][@hostname|hostaddr][:service|port]  //losf 命令檢視網路連線的使用格式

  注意上述引數均為可選引數,其中各個引數的具體解釋如下所示:

    46             //
4 和 6 分別用於指定進行查詢的 IP 地址的版本,即 -i4 使用 IPv4 進行查詢,而 -i6 使用 IPv6 進行查詢,不指定上述引數時,則對所有支援的 IP 地址進行查詢。 protocol //協議,用於指定進行查詢的網路連線所使用的協議,即 TCP 或 UDP hostname //主機名,用於指定查詢所有與 hostname 對應網路主機名相關的網路連線 hostaddr //主機地址,通過 IP 地址形式給出的進行查詢的地址資訊,該地址資訊應與前面指定的 IP 版本對應 service //服務,用於指定查詢網路連線所支援的服務, /etc/services 檔案中記錄所有有效的服務名
port //埠,指定查詢的連線所使用的埠

  以上引數中,再指定 hostname 或 hostaddr 時必須加上 '@',而指定 service 和 port 時則必須加上 ':' .使用者可以指定多個 service 和 port,只需通過 ',' 進行隔開,同時也可以通過 '-' 指定埠號範圍,如指定 1000 到 2000 埠號即為 "1000-2000". 通過執行 lsof 命令,使用者可以查詢獲得使用某個特定服務/埠/地址的網路連線的資訊,包括其 PID 程序號,其執行的具體命令和使用的協議等。

  下面通過使用例項來說明 lsof 命令的使用方式,記住與網路相關的引數需要通過 -i 引數進行指定。

  1.查詢特定埠如 5090 埠是否被佔用( 即檢視當前是否有連線使用 5090 埠 )

    lsof -i:5090                  //檢視 5090 埠的連線情況

  2.檢視與 127.0.0.1 相關的 tcp 連線情況

    lsof -i tcp@127.0.0.1        //顯示與 127.0.0.1 相關的 tcp 連線的情況

  3.檢視系統上 https 服務的連線情況

    lsof -i :https               //顯示 https 服務相關的連線

  實際上,lsof 命令的功能遠不止於查詢網路連線。該命令的在 man lsof 中的解釋為列舉開啟的檔案( list open files ).由於 Linux 環境中普通檔案( regular file ),流( stream ) 和網路檔案( 包括套接字(socket), 網路檔案系統(NFS)等)均以檔案的形式處理,故而 lsof 可以實現相當強大的查詢功能。上面對 lsof 命令對網路連線的查詢即主要基於對網路檔案的查詢來完成。

  這裡通過命令例項的形式介紹下 lsof 的簡單用法。更多的細節可以參考 lsof 的 manpage,通過命令列命令 man lsof 檢視。

  1.使用 -c string 引數指定列舉以 string 作為開始字元的命令所對應的檔案的資訊。下列命令即列舉所有以字元 b 作為開始字元的命令所對應的資訊。使用者可以看到系統上存在多個執行 bash 命令的程序。

    lsof -c b          //列舉所有執行以字元 k 開頭的命令( command ) 程序 

  2.使用 -u user 引數指定列舉所有使用者名稱為 test 或者 root 的相關程序。

    lsof -u test,root        //列舉所有與使用者 test 相關的檔案資訊

  3.在預設情況下,lsof 命令的各個引數之間的關係為 或(OR) 運算,也就是說同時指定 -u 和 -c 命令,則 lsof 會返回符合 -u 或 -c 引數的所有結果。使用者可以通過 -a 引數指定所有的引數使用 與(AND)執行,即同時指定 -a 引數後,lsof 只會返回同時符合所有引數要求的結果。

    lsof -a -u root -i @127.0.0.1      //列舉所有屬於 root 使用者的與 127.0.0.1 相關的連線

  其他

  筆者主要通過 lsof 命令來查詢某個特定的埠是否正在被佔用,並通過 kill 命令終止當前佔用特定埠的程序。kill 命令的功能為向某個程序傳送一個訊號( signal ),所有可選的訊號編號可通過 kill -L 進行檢視。想要通過 kill 命令終止某個程序,只需向該程序傳送 SIGKILL 訊號,該訊號的編號為 9,故而可以通過 kill -9 pid 的命令終止 pid 所對應的程序。

    kill -L           //輸出 kill 命令所支援的所有的訊號
    kill -9 12345     //終止程序 12345,實際為向程序 12345 傳送 SIGKILL 訊號