端口被占用的解决办法、netstat命令;Linux ps命令详解,Linux查看进程

寻求出路的程序媛 2024-09-12 15:37:01 阅读 83

文章目录

一、端口被占用的原因二、端口被占用的解决方法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,输入<code>netstat -aon | findstr 8080/端口号 , 找到占用8080端口的进程号,获取对应的进程号pid(最右侧)输入 tasklist | findstr 3412/pid,查看进程号为3412/pid对应的进程名称taskkill /f /t /im QQ.exetaskkill /f /t /im 3412,结束这个进程【taskkill /f /t /im 进程号PID或进程名称】;或者打开任务管理器,定位该进程、而后结束进程

示例:假设8889的端口被占用

在这里插入图片描述

上图中最后一步 杀掉进程可使用 <code>taskkill /f /t /im 10744,或者 taskkill /f /t /im java.exe

补充

netstat -ano #查看所有端口的占用情况

netstat -aon | findstr 8889 #查看指定端口的占用情况

tasklist #查找所有进程号对应的名称

tasklist | findstr pid #查找所有特定进程号对应的名称

netstat -aon #查看所有端口的占用情况,从左至右依次是 协议、本地地址、外部地址、状态、进程号PID

在这里插入图片描述

<code>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系统

<code>netstat -tunlp | grep 3306/端口号 或 lsof -i:port 查看端口占用情况及对应进程kill -9 进程号pid,杀掉进程

在这里插入图片描述

<code>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查看一个进程/服务 占用的端口(已知进程/服务,找端口)

<code>ps -ef | grep 服务名/进程

ps -aux | grep 服务名/进程

netstat -anp | grep 进程号 #查看进程所占用的端口号(windows用findstr代替grep

netstat -pt #显示pid和进程

在这里插入图片描述

在这里插入图片描述

查看Linux服务是否开启

<code>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关闭线程

<code>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命令 参数说明

<code>[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”表示已连接。

<code>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 中断 sleepingT 停止 traced or stoppedZ 僵死 a defunct (”zombie”) process

3.3.1 常用命令

ps -ef #查看所有进程

ps -aux #查看所有进程,包含其他使用者

ps -ef | grep tomcat #查看指定进程(grep过滤)

ps -ef 命令

在这里插入图片描述

<code>#字段解释

UID:用户ID,即进程的拥有者

PID:进程ID

PPID:父进程ID

C:进程占用的CPU百分比

STIME:进程开始启动时间

TTY:登入者的终端机位置

TIME:进程使用的CPU(运算)时间

CMD:调用进程的命令

ps -aux 命令

在这里插入图片描述

<code>#字段解释

USER:创建进程的用户

PID:进程ID

%CPU:进程占用CPU的百分比

%MEM:进程占用物理内存的百分比

VSZ:进程占用虚拟内存的大小(单位KB)

RSS:进程占用实际物理内存的大小(单位KB)

TTY:进程在哪个终端运行。

STAT:进程状态

START:进程开始启动的时间

TIME:进程使用的CPU(运算)时间

COMMAND:调用进程的命令

在这里插入图片描述

在这里插入图片描述

3.3.2 拓展命令

查看CPU/内存占用率最高的进程

查看进程的时候,让进程按照CPU使用率排序,然后展示前10行,就能清晰地看到哪些进程占用的资源比较多。

<code>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 #升序

在这里插入图片描述

查看指定用户的进程

查看某个用户开启了哪些进程,可以使用 <code>-u 参数指定用户名,比如,查看root用户的进程有哪些:

ps -u root -ef

在这里插入图片描述

分页查看进程

除了 grep 外,还可以配合 more 分页查看进程:<code>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查看进程



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。