原文鏈接:http://www.zhoubotong.site/post/38.html
端口被佔用網上很多,這種頻繁操作的命令容易忘記,寫這邊文章的目的主要是加深操作命令的印象,
Liux 查看端口占用情況可以使用 lsof 和 netstat 命令。
lsof
lsof(list open files)是一個列出當前系統打開文件的工具。
lsof 查看端口占用語法格式:
lsof -i:端口號
使用實例
查看服務器 3306 端口的佔用情況
[zpt@iZXw45Z ~]$ sudo lsof -i:3306 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 28165 mysql 33u IPv6 165455798 0t0 TCP *:mysql (LISTEN)
可以看到 3306 端口已經被mysql 服務佔用。注意:lsof -i 需要 root 用戶的權限來執行,
這裏補充下上圖lsof命令輸出的各列的含義:
COMMAND: 進程的名稱 PID: 進程標識符 USER: 進程所有者 FD: 文件描述符,應用程序通過文件描述符識別該文件 TYPE: 文件類型 DEVICE: 以逗號分隔設備編號(磁盤名稱) SIZE: 文件的大小(bytes) NODE: 索引節點(文件在磁盤上的標識) NAME: 打開文件的確切名稱
FD(文件描述列表)
cwd:表示current work dirctory,即:應用程序的當前工作目錄,這是該應用程序啓動的目錄,除非它本身對這個目錄進行更改 txt:該類型的文件是程序代碼,如應用程序二進制文件本身或共享庫,如上列表中顯示的 /sbin/init 程序 lnn:library references (AIX); er:FD information error (see NAME column); jld:jail directory (FreeBSD); ltx:shared library text (code and data); mxx :hex memory-mapped type number xx. m86:DOS Merge mapped file; mem:memory-mapped file; mmap:memory-mapped device; pd:parent directory; rtd:root directory; tr:kernel trace file (OpenBSD); v86 VP/ix mapped file; 0:表示標準輸出 1:表示標準輸入 2:表示標準錯誤
一般在標準輸出、標準錯誤、標準輸入後還跟着文件狀態模式:
u:表示該文件被打開並處於讀取/寫入模式。 r:表示該文件被打開並處於只讀模式。 w:表示該文件被打開並處於。 空格:表示該文件的狀態模式爲unknow,且沒有鎖定。 -:表示該文件的狀態模式爲unknow,且被鎖定。
TYPE(文件類型)
REG:文件 DIR:表示目錄。 CHR:表示字符類型。 BLK:塊設備類型。 UNIX: UNIX 域套接字。 FIFO:先進先出 (FIFO) 隊列。 IPv4:網際協議 (IP) 套接字
lsof常用參數以及實戰
-a:列出打開文件存在的進程; -c<進程名>:列出指定進程所打開的文件; -g:列出GID號進程詳情; -d<文件號>:列出佔用該文件號的進程; +d<目錄>:列出目錄下被打開的文件; +D<目錄>:遞歸列出目錄下被打開的文件; -n<目錄>:列出使用NFS的文件; -i<條件>:列出符合條件的進程。(4、6、協議、:端口、 @ip ) -p<進程號>:列出指定進程號所打開的文件; -u:列出UID號進程詳情; -h:顯示幫助信息; -v:顯示版本信息
查看哪些進程打開了某個文件
lsof /lib/Fonts/Brial.ttf lsof /dev/null
查看哪些進程打開了某個目錄
lsof ~/www/wwwroot/blog
查看某個進程程序所打開的文件信息
lsof -c mysql #查看mysql這個進程打開的文件
lsof綜合舉例
lsof -i:8080:查看8080端口占用 lsof abc.txt:顯示開啓文件abc.txt的進程 lsof -c abc:顯示abc進程現在打開的文件 lsof -c -p 1234:列出進程號爲1234的進程所打開的文件 lsof -g gid:顯示歸屬gid的進程情況 lsof +d /usr/local/:顯示目錄下被進程開啓的文件 lsof +D /usr/local/:同上,但是會搜索目錄下的目錄,時間較長 lsof -d 4:顯示使用fd爲4的進程 lsof -i -U:顯示所有打開的端口和UNIX domain文件
再介紹另外一種常用的命令:
netstat
netstat -tunlp 用於顯示 tcp,udp 的端口和進程等相關情況。
netstat 查看端口占用語法格式:
netstat -tunlp | grep 端口號 -t (tcp) 僅顯示tcp相關選項 -u (udp)僅顯示udp相關選項 -n 拒絕顯示別名,能顯示數字的全部轉化爲數字 -l 僅列出在Listen(監聽)的服務狀態 -p 顯示建立相關鏈接的程序名
例如查看 8080 端口的情況,使用以下命令:
netstat -tunlp | grep 8080 tcp6 0 0 :::8080 :::* LISTEN 6256/./express
更多命令:
netstat -ntlp //查看當前所有tcp端口 netstat -ntulp | grep 80 //查看所有80端口使用情況 netstat -ntulp | grep 3306 //查看所有3306端口使用情況
kill
在查到端口占用的進程後,如果你要殺掉對應的進程可以使用 kill 命令:
kill -9 PID
比如上實例,我們看到mysql的 3306 端口對應的 PID 爲 28165,使用以下命令殺死進程:
kill -9 28165