文章目录
- 一、端口被占用的原因
- 二、端口被占用的解决方法
- 2.1 Windows系统
- 2.2 Linux系统
- 三、Linux命令补充
- 3.1 Linux查看端口占用情况
- 3.2 netstat命令详解
- 3.3 ps命令
- 3.3.1 常用命令
- 3.3.2 拓展命令
- 3.3.3 字段补充
运行软件或程序时,有时会出现以下问题、导致运行失败:
Web server failed to start. Port 8080 was already in use.
表示8080端口被占用,程序启动失败。
前言:注意区分 端口、进程号pid、服务名字。以redis服务为例
端口为 6379,进程号为 2179,服务名称为 redis
一、端口被占用的原因
- 进程未正确释放端口:当一个进程退出时,如果它没有正确释放占用的端口,其他进程就无法使用该端口。
- 同一端口被多个进程监听:在某些情况下,多个进程可能尝试同时监听同一个端口,导致端口占用冲突。
- 非法软件或恶意程序:一些非法软件或恶意程序可能会占用系统的端口,以进行非法活动或攻击。
二、端口被占用的解决方法
2.1 Windows系统
- window键+R 进入cmd,输入
netstat -aon | findstr 8080/端口号
, 找到占用8080端口的进程号,获取对应的进程号pid(最右侧) - 输入
tasklist | findstr 3412/pid
,查看进程号为3412/pid对应的进程名称 taskkill /f /t /im QQ.exe
或taskkill /f /t /im 3412
,结束这个进程【taskkill /f /t /im 进程号PID或进程名称
】;或者打开任务管理器,定位该进程、而后结束进程
示例:假设8889的端口被占用
上图中最后一步 杀掉进程可使用 taskkill /f /t /im 10744
,或者 taskkill /f /t /im java.exe
补充
netstat -ano #查看所有端口的占用情况
netstat -aon | findstr 8889 #查看指定端口的占用情况
tasklist #查找所有进程号对应的名称
tasklist | findstr pid #查找所有特定进程号对应的名称
netstat -aon #查看所有端口的占用情况,从左至右依次是 协议、本地地址、外部地址、状态、进程号PID。
C:\Users\28687>netstat --help
显示协议统计信息和当前 TCP/IP 网络连接。
NETSTAT [-a] [-b] [-e] [-f] [-i] [-n] [-o] [-p proto] [-r] [-s] [-t] [-x] [-y] [interval]
-a 显示所有连接和侦听端口。
-b 显示在创建每个连接或侦听端口时涉及的
可执行文件。在某些情况下,已知可执行文件托管
多个独立的组件,此时会
显示创建连接或侦听端口时
涉及的组件序列。在此情况下,可执行文件的
名称位于底部 [] 中,它调用的组件位于顶部,
直至达到 TCP/IP。注意,此选项
可能很耗时,并且可能因为你没有足够的
权限而失败。
-e 显示以太网统计信息。此选项可以与 -s 选项
结合使用。
-f 显示外部地址的完全限定
域名(FQDN)。
-i 显示 TCP 连接在当前状态所花费的时间。
-n 以数字形式显示地址和端口号。
-o 显示拥有的与每个连接关联的进程 ID。
-p proto 显示 proto 指定的协议的连接;proto
可以是下列任何一个: TCP、UDP、TCPv6 或 UDPv6。如果与 -s
选项一起用来显示每个协议的统计信息,proto 可以是下列任何一个:
IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 或 UDPv6。
-q 显示所有连接、侦听端口和绑定的
非侦听 TCP 端口。绑定的非侦听端口
不一定与活动连接相关联。
-r 显示路由表。
-s 显示每个协议的统计信息。默认情况下,
显示 IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 和 UDPv6 的统计信息;
-p 选项可用于指定默认的子网。
-t 显示当前连接卸载状态。
-x 显示 NetworkDirect 连接、侦听器和共享
终结点。
-y 显示所有连接的 TCP 连接模板。
无法与其他选项结合使用。
interval 重新显示选定的统计信息,各个显示间暂停的
间隔秒数。按 CTRL+C 停止重新显示
统计信息。如果省略,则 netstat 将打印当前的
配置信息一次。
2.2 Linux系统
netstat -tunlp | grep 3306/端口号
或lsof -i:port
查看端口占用情况及对应进程kill -9 进程号pid
,杀掉进程
netstat -tunlp | grep 6379
输出结果中,LISTEN 表示被占用,2151/redis-server 分别是:进程PID/进程名(或者通过命令查找进程PID,lsof -i:6379
)。通过进程PID关闭进程。
三、Linux命令补充
3.1 Linux查看端口占用情况
在Linux中,有几种方式可以查看端口占用情况(已知端口,找进程):
1)netstat命令
- 使用
netstat -tulnp
命令可以查看所有正在监听的TCP和UDP端口及其占用情况。 - 如果需要查看特定端口的占用情况,可以结合使用
grep
命令,如netstat -tulnp | grep <端口号>
。
2)ss命令
ss
命令是另一个用于显示套接字统计信息的工具,与netstat
类似。- 使用
ss -tuln
可以查看所有正在监听的端口,同样可以使用grep
命令筛选特定端口,如ss -tuln | grep <端口号>
。
3)lsof命令
lsof
(List Open Files)命令不仅可以列出当前系统打开的文件,还可以用来查看端口占用情况。- 使用
lsof -i :<端口号>
可以查看特定端口的占用情况。
Linux查看一个进程/服务 占用的端口(已知进程/服务,找端口):
ps -ef | grep 服务名/进程
ps -aux | grep 服务名/进程
netstat -anp | grep 进程号 #查看进程所占用的端口号(windows用findstr代替grep
netstat -pt #显示pid和进程
查看Linux服务是否开启
ps -ef | grep 服务名 或 ps -aux | grep 服务名 #查看进程状态
lsof -i:端口号 #看端口.前提是要知道服务的端口号是多少,常用端口号 nginx 80,FTP 21,SSH 22,Telnet 23,HTTP 80,HTTPS 443,Tomcat 8080,Oracle 1521,MySQL 3306,SQLServer 1433,Redis 6379
netstat -anp | grep 端口号 #查看监听端口(若存在该端口的监听,证明服务正在运行。该方法只适用于部分服务,且只能判断服务是否正在监听指定的端口,无法判断服务是否运行正常)
systemctl status 服务名 或 service 服务名 status #看状态Active,显示active(running)就表示服务起来了
#直接访问,nginx服务起来之后可直接在网页上输入ip去访问,能访问表示服务起来;若不能访问也不一定是服务没起来,可能是防火墙没关、selinux没关等
#看日志 less /var/log/messages,shift+g跳到底部 看到Started nginx 表示nginx已起
Linux关闭线程
kill -pid (先通过ps -ef命令确定要杀死进程的pid,再kill -pid)
kill -l pid -l选项告诉kill命令用启动进程的用户已注销的方式结束线程
kill -9 pid 迫使进程在运行时突然终止,一般不推荐使用
3.2 netstat命令详解
在linux使用过程中,有时候需要了解当前系统开放了哪些端口,并且还需要查看开放这些端口的具体进程和用户,可以使用netstat
命令。
netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息。查看网络连接、路由表、接口状态及端口
netstat -tunlp #查看已经启动的服务
netstat -tunlp | grep 3306/端口号 #查看指定端口的占用情况
lsof -i:3306 #查看特定端口的占用情况
netstat命令 参数说明
[root@localhost ~]# netstat --help
usage: netstat [-vWeenNcCF] [<Af>] -r netstat {-V|--version|-h|--help}
netstat [-vWnNcaeol] [<Socket> ...]
netstat { [-vWeenNac] -I[<Iface>] | [-veenNac] -i | [-cnNe] -M | -s [-6tuw] } [delay]
-r, --route display routing table。显示Routing Table
-I, --interfaces=<Iface> display interface table for <Iface>
-i, --interfaces display interface table。显示网络界面信息表单
-g, --groups display multicast group memberships。显示多重广播功能群组组员名单
-s, --statistics display networking statistics (like SNMP)。显示网络工作信息统计表
-M, --masquerade display masqueraded connections。显示伪装的网络连线
-v, --verbose be verbose。显示指令执行过程
-W, --wide don't truncate IP addresses
-n, --numeric don't resolve names。直接使用ip地址,而不通过域名服务器
--numeric-hosts don't resolve host names
--numeric-ports don't resolve port names
--numeric-users don't resolve user names
-N, --symbolic resolve hardware names。显示网络硬件外围设备的符号连接名称
-e, --extend display other/more information。显示网络其他相关信息
-p, --programs display PID/Program name for sockets。显示正在使用Socket的程序识别码和程序名称
-o, --timers display timers。显示计时器
-c, --continuous continuous listing。持续列出网络状态
-l, --listening display listening server sockets。显示在Listen(监听)中的服务器Socket
-a, --all display all sockets (default: connected)。显示所有连线中的Socket
-F, --fib display Forwarding Information Base (default)。显示FIB
-C, --cache display routing cache instead of FIB。显示路由器配置的快取信息
-Z, --context display SELinux security context for sockets
<Socket>={-t|--tcp} {-u|--udp} {-U|--udplite} {-S|--sctp} {-w|--raw}
{-x|--unix} --ax25 --ipx --netrom
-t或--tcp:显示TCP传输协议的连线状况
-u或--udp:显示UDP传输协议的连线状况
<AF>=Use '-6|-4' or '-A <af>' or '--<af>'; default: inet
List of possible address families (which support routing):
inet (DARPA Internet) inet6 (IPv6) ax25 (AMPR AX.25)
netrom (AMPR NET/ROM) ipx (Novell IPX) ddp (Appletalk DDP)
x25 (CCITT X.25)
netstat常见命令
netstat -a #列出所有端口
netstat -at #列出所有 tcp 端口
netstat -au #列出所有 udp 端口
netstat -l #只显示监听端口
netstat -lt #只列出所有监听 tcp 端口
netstat -lu #只列出所有监听 udp 端口
netstat -lx #列出所有监听 UNIX 端口
netstat -s #显示所有端口的统计信息
netstat -p #输出中显示 PID 和进程名称
netstat -n #netstat输出中不显示主机、端口和用户名 (host, port or user)。即不用别名显示、只用数字显示
netstat -ant | wc -l #统计tcp数量监听的数量
netstat -anp | grep 应用 #显示所有的网络连接(包括监听和非监听套接字)和端口信息,并通过grep命令来过滤输出结果
netstat -anp | grep :6379 #查看所有监听在端口80上的进程
netstat -anp | grep redis #查看redis进程是否启动
标记所在情况:
- 一个叫”redis-server“的进程,正在监听 0.0.0.0:6379 / 0.0.0.0:* 端口等等,”LISTEN“表示监听;2154 为PID、即进程id,redis-server 为服务/应用名称。
- 一个叫“redis-server”的进程,外部有个“39406”端口,连接了它的“6379”端口,“ESTABLISHED”表示已连接。
netstat -anp命令简单说明:
-a,显示所有
-n,不用别名显示,只用数字显示
-p,显示进程号和进程名
3.3 ps命令
Linux中的ps命令,其缩写为 Process Status,其作用为 查看系统进程,比如正在运行的进程有哪些,什么时候开始运行的,哪个用户运行的,占用了多少资源。
参数:
-
-e 显示所有进程
-
-f 显示所有字段(UID,PPIP,C,STIME字段)
-
-a 显示一个终端的所有进程
-
-u 显示当前用户进程和内存使用情况
-
-x 显示没有控制终端的进程
-
–sort 按照列名排序
ps命令列出的是当前进程的快照,即执行ps命令时刻的进程情况;如果想要动态地显示进程信息,可使用top命令。
Linux进程状态
在Linux系统上,进程有5种状态:
- 运行(正在运行或在运行队列中等待)
- 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)
- 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
- 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)
- 停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)
ps工具标识进程的5种状态码:
- D 不可中断 uninterruptible sleep (usually IO)
- R 运行 runnable (on run queue)
- S 中断 sleeping
- T 停止 traced or stopped
- Z 僵死 a defunct (”zombie”) process
3.3.1 常用命令
ps -ef #查看所有进程
ps -aux #查看所有进程,包含其他使用者
ps -ef | grep tomcat #查看指定进程(grep过滤)
ps -ef 命令
#字段解释
UID:用户ID,即进程的拥有者
PID:进程ID
PPID:父进程ID
C:进程占用的CPU百分比
STIME:进程开始启动时间
TTY:登入者的终端机位置
TIME:进程使用的CPU(运算)时间
CMD:调用进程的命令
ps -aux 命令
#字段解释
USER:创建进程的用户
PID:进程ID
%CPU:进程占用CPU的百分比
%MEM:进程占用物理内存的百分比
VSZ:进程占用虚拟内存的大小(单位KB)
RSS:进程占用实际物理内存的大小(单位KB)
TTY:进程在哪个终端运行。
STAT:进程状态
START:进程开始启动的时间
TIME:进程使用的CPU(运算)时间
COMMAND:调用进程的命令
3.3.2 拓展命令
- 查看CPU/内存占用率最高的进程
查看进程的时候,让进程按照CPU使用率排序,然后展示前10行,就能清晰地看到哪些进程占用的资源比较多。
ps -aux --sort=-pcpu | head -11
ps -aux --sort=-pmem | head -11
head -11
是因为标题也算一行
+
、-
号可以调整排序,-pcpu
表示降序,+pcpu
表示升序把
-pcpu
换成-pmem
,就能查看内存使用最多的10个进程
如果不限制行数,也可以使用 sort
按照指定的列排序。
ps -aux | sort -nk 4 -r #降序
ps -aux | sort -nk 4 #升序
- 查看指定用户的进程
查看某个用户开启了哪些进程,可以使用 -u
参数指定用户名,比如,查看root用户的进程有哪些:
ps -u root -ef
- 分页查看进程
除了 grep 外,还可以配合 more 分页查看进程:ps -ef | more
翻页的操作同 more 命令,q键退出,空格键翻页
3.3.3 字段补充
1)TTY字段(终端类型)
TTY字段表示运行进程的终端是哪个,这里的终端类型有两种:tty和pts。
- tty:表示物理终端,其中tty1~6是本地字符界面终端,tty7是本地图形终端
- pts:表示虚拟终端,通常指远程连接的终端,范围是pts/0~255,比如第一个远程连接的终端是pts/0,第二个远程连接的终端是pts/1,依次类推。
2)STAT字段(进程状态)
STAT字段表示进程的状态,常见的状态有以下几种:
- D:睡眠状态(不可被唤醒),常用于I/O情况。
- R:进程正在运行
- S:睡眠状态(可被唤醒)
- T:停止状态
- W:内存交互状态
- Z:僵尸进程(不存在但暂时无法消除)
- <:高优先级
- N:低优先级
- L:被锁入内存
- s:包含子进程
- l:多线程
- +:位于后台
3)僵尸进程
进程由于非正常停止或程序编写错误,导致子进程比父进程先结束,而父进程又没有正常回收子进程,使子进程一直在内存中,导致资源浪费。这种情况就是僵尸进程。
PS:正常情况下应该是父进程先结束,然后子进程由init接管,init 结束子进程并回收对应的资源。
参考 Linux ps命令详解,Linux查看进程