我们在启动服务的时候,通常会指定要使用的端口号。但是有时服务启动时,会出现端口被占用的情况,日志中通常能找到关键信息port is already in use
这个时候,首先就需要找到是什么服务占用了这个端口,比如说我们指定了服务要使用8080端口
使用lsof指令,通过被占用的端口来查询进程的id(PORT → PID)
# 命令: lsof -i:${PORT}
sudo lsof -i:8080
[bigdata@hadoop101 ~]$ sudo lsof -i:8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 19394 bigdata 48u IPv6 165811 0t0 TCP *:webcache (LISTEN)
查询到进程的pid是19394,最直接的方式当然就是通过kill -9 ${PID}来结束占用8080端口的进程。不过出于安全的考虑,最好确认下,占用端口8080的服务是什么,是否可以直接关闭
通过ps -ef | grep ${PID}查看当前进程的详细信息
[bigdata@hadoop101 ~]$ sudo ps -ef | grep 19394
bigdata 17172 16675 0 09:33 pts/1 00:00:00 grep --color=auto 19394
bigdata 19394 1 0 May06 ? 00:33:49 /opt/module/jdk1.8.0_212/bin/java -Dzookeeper.log.dir=/opt/module/zookeeper-3.5.7/bin/../logs -Dzookeeper.log.file=zookeeper-bigdata-server-hadoop101.log -Dzookeeper.root.logger=INFO,CONSOLE -XX:+HeapDumpO...
我们发现这个服务中出现了很多zookeeper关键字,确认后发现是zookeeper服务占用了8080端口
如果确认这个服务可以关闭,就执行
# 替换成实际的PID,请仔细确认服务的PID
kill -9 ${PID}
那如果服务不能关闭的话,就需要我们重新指定新的端口,避免使用机器上已经用到的端口。替换成新的端口后,可以在服务启动前,执行sudo lsof -i:${PID} ,来查看新的端口是否已经被占用