一、前言
Mac OS/Linux 启用一些服务的时候,如果非正常退出,再次启动经常会遇到 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)是一个列出当前系统打开文件的工具。
常用命令:
1. 查看指定端口占用情况:
sudo lsof -nP -iTCP:端口号 -sTCP:LISTEN
2. 查看所有进程监听的端口:
sudo lsof -nP -iTCP -sTCP:LISTEN
3. 查看所有java进程监听的端口:
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}')