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

发布于:2024-07-06 ⋅ 阅读:(21) ⋅ 点赞:(0)


运行软件或程序时,有时会出现以下问题、导致运行失败:

Web server failed to start. Port 8080 was already in use.

表示8080端口被占用,程序启动失败。

前言:注意区分 端口、进程号pid、服务名字。以redis服务为例

在这里插入图片描述

端口为 6379,进程号为 2179,服务名称为 redis

一、端口被占用的原因

  1. 进程未正确释放端口:当一个进程退出时,如果它没有正确释放占用的端口,其他进程就无法使用该端口。
  2. 同一端口被多个进程监听:在某些情况下,多个进程可能尝试同时监听同一个端口,导致端口占用冲突。
  3. 非法软件或恶意程序:一些非法软件或恶意程序可能会占用系统的端口,以进行非法活动或攻击。

二、端口被占用的解决方法

2.1 Windows系统

  • window键+R 进入cmd,输入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的端口被占用

在这里插入图片描述

上图中最后一步 杀掉进程可使用 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查看进程


网站公告

今日签到

点亮在社区的每一天
去签到