當你在電腦上想啟動一個服務,電腦卻提示"port already in use",此時,可以使用lsof命令來查看那個進程佔用了該連接埠(lsof -i:port). lsof是LiSt Open Files的縮寫,在linux環境下,任何事物都以檔案的形式存在,通過檔案不僅僅可以訪問常規資料,還可以訪問網路連接和硬體。
lsof的使用方法如下:
qsun@qsun-VirtualBox:~$ sudo lsof | head -5[sudo] password for qsun: lsof: WARNING: can't stat() fuse.gvfs-fuse-daemon file system /home/qsun/.gvfs Output information may be incomplete.COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEinit 1 root cwd DIR 8,1 4096 2 /init 1 root rtd DIR 8,1 4096 2 /init 1 root txt REG 8,1 194528 172 /sbin/initinit 1 root mem REG 8,1 47040 132308 /lib/i386-linux-gnu/libnss_files-2.15.so
lsof輸出各列資訊的意義如下:
COMMAND:進程的名稱 PID:進程標識符
USER:進程所有者
FD:檔案描述符,應用程式通過檔案描述符識別該檔案。如cwd、txt等 TYPE:檔案類型,如DIR、REG等
DEVICE:指定磁碟的名稱
SIZE:檔案的大小
NODE:索引節點(檔案在磁碟上的標識)
NAME:開啟檔案的確切名稱
FD 列中的檔案描述符cwd 值表示應用程式的當前工作目錄,這是該應用程式啟動的目錄,除非它本身對這個目錄變更,txt 類型的檔案是程式碼,如應用程式二進位檔案本身或共用庫,如上列表中顯示的 /sbin/init 程式。
其次數值表示應用程式的檔案描述符,這是開啟該檔案時返回的一個整數。如上的最後一行檔案/dev/initctl,其檔案描述符為 10。u 表示該檔案被開啟並處於讀取/寫入模式,而不是唯讀 或唯寫 (w) 模式。同時還有大寫 的W 表示該應用程式具有對整個檔案的寫鎖。該檔案描述符用於確保每次只能開啟一個應用程式執行個體。初始開啟每個應用程式時,都具有三個檔案描述符,從 0 到 2,分別表示標準輸入、輸出和錯誤流。所以大多數應用程式所開啟的檔案的 FD 都是從 3 開始。
與 FD 列相比,Type 列則比較直觀。檔案和目錄分別稱為 REG 和 DIR。而CHR 和 BLK,分別表示字元和塊裝置;或者 UNIX、FIFO 和 IPv4,分別表示 UNIX 域通訊端、先進先出 (FIFO) 隊列和網際協議 (IP) 通訊端。
lsof文法格式是:
lsof [options] filename
lsof abc.txt 顯示開啟檔案abc.txt的進程lsof -c abc 顯示命令abc現在開啟的檔案(c是command的縮寫)lsof -g gid 顯示歸屬gid的進程情況lsof +d /usr/local/ 顯示目錄下被進程開啟的檔案lsof +D /usr/local/ 同上,但是會搜尋目錄下的目錄,時間較長lsof -d 4 顯示使用fd為4的進程lsof -i 用以顯示合格進程情況lsof -i[46] [protocol][@hostname|hostaddr][:service|port] 46 --> IPv4 or IPv6 protocol --> TCP or UDP hostname --> Internet host name hostaddr --> IPv4地址 service --> /etc/service中的 service name (可以不止一個) port --> 連接埠號碼 (可以不止一個)
使用執行個體
lsof `which httpd` //那個進程在使用apache的可執行檔lsof /etc/passwd //那個進程在佔用/etc/passwdlsof /dev/hda6 //那個進程在佔用hda6lsof /dev/cdrom //那個進程在佔用光碟機lsof -c sendmail //查看sendmail進程的檔案使用方式lsof -c courier -u ^zahn //顯示出那些檔案被以courier打頭的進程開啟,但是並不屬於使用者zahnlsof -p 30297 //顯示那些檔案被pid為30297的進程開啟lsof -D /tmp 顯示所有在/tmp檔案夾中開啟的instance和檔案的進程。但是symbol檔案並不在列lsof -u1000 //查看uid是100的使用者的進程的檔案使用方式lsof -utony //查看使用者tony的進程的檔案使用方式lsof -u^tony //查看不是使用者tony的進程的檔案使用方式(^是取反的意思)lsof -i //顯示所有開啟的連接埠lsof -i:80 //顯示所有開啟80連接埠的進程lsof -i -U //顯示所有開啟的連接埠和UNIX domain檔案lsof -i UDP@[url]www.akadia.com:123 //顯示那些進程開啟了到www.akadia.com的UDP的123(ntp)連接埠的連結lsof -i tcp@ohaha.ks.edu.tw:ftp -r //不斷查看目前ftp串連的情況(-r,lsof會永遠不斷的執行,直到收到中斷訊號,+r,lsof會一直執行,直到沒有檔案被顯示,預設是15s重新整理)lsof -i tcp@ohaha.ks.edu.tw:ftp -n //lsof -n 不將IP轉換為hostname,預設是不加上-n參數
參考:http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316599.html