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

news2024/11/23 11:20:43

文章目录

  • 一、端口被占用的原因
  • 二、端口被占用的解决方法
    • 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

一、端口被占用的原因

  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查看进程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1888164.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript中的立即执行函数表达式(Immediately Invoked Function Expression, IIFE)

聚沙成塔每天进步一点点 本文回顾 ⭐ 专栏简介JavaScript中的立即执行函数表达式&#xff08;Immediately Invoked Function Expression, IIFE&#xff09;1. 引言2. IIFE的概念2.1 概述2.2 语法2.3 历史背景 3. IIFE的作用3.1 创建独立作用域3.2 模块化代码3.3 防止变量提升3.…

我不小心把生产的数据改错了!同事帮我用MySQL的BinLog挽回了罚款

之前在生产做修改数据的时候不小心改错了一行数据&#xff0c;本来以为会被通报批评&#xff0c;但是同事利用binlog日志查看到了之前的旧数据&#xff0c;并且帮我回滚了&#xff0c;学到了&#xff0c;所以写了一篇binlog的文章分享给大家。 MySQL的Binary Log&#xff08;简…

CentOS 7 停止维护(2024-6-30)后可用在线yum源 —— 筑梦之路

众所周知&#xff0c;centos 7 在2024年6月30日&#xff0c;生命周期结束&#xff0c;官方不再进行支持维护&#xff0c;而很多环境一时之间无法完全更新替换操作系统&#xff0c;因此对于yum源还是需要的&#xff0c;特别是对于互联网环境来说&#xff0c;在线yum源使用方便很…

标注比赛一种计分方法

这段时间试着在公司内部举办一场图片标注大赛&#xff0c;我负责制定规则&#xff0c;挑选比赛素材。这几天试了一种得分计算方法&#xff0c;结果尚可。利用我司研发的标注工具&#xff0c;我们很容易就可以得出下图结果。 这个结果中的标注框其实就是标准答案&#xff0c;漏检…

面向物联网行业的异常监控追踪技术解决方案:技术革新与运维保障

在现代高度数字化和互联的环境中&#xff0c;物联网技术已经深入到我们生活的方方面面。特别是在家庭和工业环境中&#xff0c;物联网系列通讯作为连接各类设备的关键枢纽&#xff0c;其稳定性和可靠性显得尤为重要。本文将介绍一种创新的监控系统&#xff0c;旨在实时跟踪和分…

无人机基础知识(模式篇)

姿态模式&#xff1a;姿态模式通常是在GPS模式无法使用的情况下进行操作的模式。通过操作杆对无人机进行操控&#xff0c;姿态模式下无人机只能提供自稳&#xff0c;不提供定点悬停&#xff0c;受外界影响很大&#xff1b; GPS模式&#xff1a;GPS模式通俗一点就是依靠GPS将无…

电路笔记(PCB):电流容量(IPC-2221和IPC-2152)+阻抗匹配

电流容量 IPC-2221经验公式 I K T b A c IK\times T^{b}\times A^{c} IKTbAc 这个公式用于估计PCB&#xff08;Printed Circuit Board&#xff0c;印刷电路板&#xff09;导线上的电流&#xff08;I&#xff09;&#xff0c;其中T和A分别表示温度&#xff08;Temperature&a…

SQL语句(DDL)

关系型数据库&#xff1a;建立在关系模型基础上&#xff0c;由多张相互连接的二维表组成的数据库 SQL语句 DDL-数据库操作 DDL-表操作-查询 DDL-表操作-创建 创建一个名为tb_user的表 mysql> use itheim; Database changed mysql> create table tb_user(-> id …

Python基础入门知识

目录 引言 简要介绍Python语言 为什么要学习Python Python的应用领域 Python安装和环境配置 Python的下载和安装(Windows, macOS, Linux) 配置Python环境变量 安装和使用IDE(如PyCharm, VS Code) Python基本语法 注释 变量和数据类型(数字,字符串,列表,元组,字典,…

【CUDA】 由GPGPU控制核心架构考虑CUDA编程中线程块的分配

GPGPU架构特点 由于典型的GPGPU只有小的流缓存&#xff0c;因此一个存储器和纹理读取请求通常需要经历全局存储器的访问延迟加上互连和缓冲延迟&#xff0c;可能高达数百个时钟周期。与CPU通过巨大的工作集缓存而降低延迟不同&#xff0c;GPU硬件多线程提供了数以千计的并行独…

服务器数据恢复—raid5阵列硬盘出现大量坏道的数据恢复案例

服务器存储数据恢复环境&故障&#xff1a; 一台DELL EqualLogic PS 4000存储中有一组由12块磁盘组建的raid5阵列&#xff0c;存储空间划分3个同等大小的卷&#xff0c;采用的VMFS文件系统。 两块硬盘指示灯亮黄色&#xff0c;raid5阵列崩溃&#xff0c;存储变得不可用。 服…

尝试修改苍穹外卖为”李小罗餐厅“

学习苍穹外卖后&#xff0c;将其修改为自己所需要的项目&#xff0c;也是对苍穹外卖项目的加深理解 对项目之间的连接等关系进一步清晰&#xff0c;那么便开始吧 d1_开始修改 修改名字为”李小罗餐厅“ src\views\login\index.vue src\router.ts 结果展示 修改进来之后的展示…

昇思25天学习打卡营第9天|MindSpore-Vision Transformer图像分类

Vision Transformer图像分类 Vision Transformer(ViT)简介 近些年,随着基于自注意(Self-Attention)结构的模型的发展,特别是Transformer模型的提出,极大地促进了自然语言处理模型的发展。由于Transformers的计算效率和可扩展性,它已经能够训练具有超过100B参数的空前…

2.2.5 C#中显示控件BDPictureBox 的实现----ROI交互续2

2.2.5 C#中显示控件BDPictureBox 的实现----ROI交互续2 1 ROI数组作用说明 变量&#xff1a;m_ROIs[5] ROI 使用效果图 ROI数组说明 2 ROI显示逻辑图 ROI 交互主要是在设定状态下&#xff0c; runmode下只要普通显示即可 3 主要ROI显示函数函数 判断当前鼠标是否获取…

20240702在vmware17.5虚拟机中让ubuntu22.04使用主机的代理上网

20240702在vmware17.5虚拟机中让ubuntu22.04使用主机的代理上网 2024/7/2 14:41 百度&#xff1a;vmware 虚拟机 使用主机代理 上网 https://blog.csdn.net/nomoremorphine/article/details/138738065?utm_mediumdistribute.pc_relevant.none-task-blog-2~default~baidujs_ba…

周下载量20万的npm包---store

https://www.npmjs.com/package/store <script setup> import { onMounted } from vue import store from storeonMounted(() > {store.set(user, { name: xutongbao })let user store.get(user)console.log(user) //对象console.log(localStorage.getItem(user)) //…

[SIEMENS/S7-300] 接线图分析

SIEMENS-S7-300 系列 接线图 (整体) (PLC) 操作员面板 (操作员控制面板) (24v在第11页面第九栏,12页面第一栏。PE在17页第九栏) 跟进地址,到24V电源适配器 操作面板来自X4.0端子块,并且带有WC4.0标签的电缆。 PLC 操作面板与PLC之间通信使用Profibus电缆,直接通过CPU的MPI端…

Kotlin中的数据类型

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

OBS 26.1.1 64-bit (win10)

OBS 26.1.1 64-bit &#xff08;win10&#xff09;采集窗口问题 出现采集界面错误 点击【属性】 修改【采集方式】 完美解决

Vue3 sortablejs 表格拖拽后,表格无法更新的问题处理

实用sortablejs在vue项目中实现表格行拖拽排序 你可能会发现&#xff0c;表格排序是可以实现&#xff0c;但是我们基于数据驱动的vue中关联的数据并没有发生变化&#xff0c; 如果你的表格带有列固定(固定列实际上在dom中有两个表格&#xff0c;其中固定的列在一个表格中&…