问题描述
不知小伙伴们是否遇到过端口异常占用问题,本身自身产品一跑完全没有问题,但是就因为在客户或者其他环境下某些操作,异常原因导致了上一次的端口仍然被占用。
Linux查看端口测试
Linux 查看端口占用情况可以使用 lsof 和 netstat 命令。
- lsof
lsof(list open files)是一个列出当前系统打开文件的工具。
lsof 查看端口占用语法格式
lsof -i:端口号
lsof -i 需要 root 用户的权限来执行,这里我们可以看到如下不同内容的列表信息,这里我列出头部列信息,第二行是代表的含义。
COMMAND | PID | USER | FD | TYPE | DEVICE | SIZE/OFF | NODE | NAME |
---|---|---|---|---|---|---|---|---|
进程的名称 | 进程标识符 | 进程所有者 | 文件描述符,比如txt,word等 | 文件类型 | 指定磁盘的名称 | 文件的大小 | 索引节点 | 打开文件的确切名称 |
更多lsof command:
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
- 查看8000端口的使用情况
netstat -ntulp | grep 8000
- 查看8000端口的使用情况
-
结束进程
- 结束占用8000端口的程序
kill -9 8000
- 结束占用8000端口的程序
这个命令虽好,可不能乱用哦,毕竟作为打工人,不小心把重要进程结束可一个Disaster
就算你说估计也不好使了。
代码实现
代码通过host和port作为传入代码,返回一个布尔变量来看这个端口是否被占用
private static boolean checkPortAvailable(String host, String port) {
boolean isAlive = false;
int Port = Integer.parseInt(port);
SocketAddress socketAddress = new InetSocketAddress(hostName, Port);
Socket socket = new Socket();
int timeout = 2000;
try {
socket.connect(socketAddress, timeout);
socket.close();
isAlive = true;
} catch (SocketTimeoutException exception) {
Log.logFile("SocketTimeoutException " + hostName + ":" + Port + ". " + exception.getMessage());
} catch (IOException exception) {
Log.logFile("IOException 不能连接到 " + hostName + ":" + Port + ". " + exception.getMessage());
}
return isAlive;
}