一、前言
Mac OS/Linux 啟用一些服務的時候,如果非正常退出,再次啟動經(jīng)常會遇到 address already in use
,端口被先前啟動的服務進程所占用,導致服務無法使用。
這種情況,可以注銷或重啟(注銷不一定有用),或在終端中查找占用端口的進程并殺死,然后重啟服務。
二、如何查看端口占用情況?
查看端口的命令有netstat、lsof等。
2.1. netstat命令
netstat -an | grep 端口號
注意:
OS X 的 netstat 不能查看使用端口的PID/程序名(linux可以),建議使用lsof命令代替。
2.2. lsof命令
lsof(list open files)是一個列出當前系統(tǒng)打開文件的工具。
常用命令:
1. 查看指定端口占用情況:
sudo lsof -nP -iTCP:端口號 -sTCP:LISTEN
2. 查看所有進程監(jiān)聽的端口:
sudo lsof -nP -iTCP -sTCP:LISTEN
3. 查看所有java進程監(jiān)聽的端口:
sudo lsof -nP -iTCP -sTCP:LISTEN | grep java
結果如下:
java 45380 vision 140u IPv6 0x907f281d0aff1577 0t0 TCP *:53761 (LISTEN)
java 45380 vision 141u IPv6 0x907f281d12df9037 0t0 TCP *:53759 (LISTEN)
java 45380 vision 147u IPv6 0x907f281d1127f597 0t0 TCP *:53762 (LISTEN)
java 45380 vision 154u IPv6 0x907f281d112e2597 0t0 TCP *:8761 (LISTEN)
java 45382 vision 159u IPv6 0x907f281d16a36577 0t0 TCP *:53774 (LISTEN)
java 45382 vision 160u IPv6 0x907f281d16a36017 0t0 TCP *:53772 (LISTEN)
java 45382 vision 166u IPv6 0x907f281d14c7b557 0t0 TCP *:53775 (LISTEN)
java 45382 vision 184u IPv6 0x907f281d16a73fd7 0t0 TCP *:8081 (LISTEN)
4. 輸出占用該端口的 PID:
lsof -nP -iTCP:端口號 |grep LISTEN|awk '{print $2;}'
lsof命令會同時列出PID,方便kill。
- n 表示不顯示主機名
- P 表示不顯示端口俗稱
- 不加 sudo 只能查看以當前用戶運行的程序
三. kill進程
- 殺掉指定進程
找到進程的PID,使用kill命令:
kill -9 PID
- 殺掉所有java進程:
kill -9 $(sudo lsof -nP -iTCP -sTCP:LISTEN | grep java | awk '{print $2}')