【问题标题】:How to kill a process running on particular port in Linux?如何杀死Linux中特定端口上运行的进程?
【发布时间】:2012-07-19 23:29:34
【问题描述】:

我尝试使用来自 tomcat /bin 目录的./shutdown.sh 关闭 tomcat。但是发现服务器没有正常关闭。因此我无法重新启动
我的 tomcat 正在端口 8080 上运行。

我想杀死在8080 上运行的tomcat 进程。我首先想让进程列表在特定端口 (8080) 上运行,以便选择要杀死的进程。

【问题讨论】:

标签: linux unix port kill-process


【解决方案1】:

fuser 8080/tcp 将打印绑定在该端口上的进程的 PID。

而这个fuser -k 8080/tcp 会杀死那个进程。

仅适用于 Linux。更普遍的是使用lsof -i4(或 6 用于 IPv6)。

【讨论】:

  • 这是否也会关闭可能连接到 8080 的套接字?
  • 它没有正确关闭端口。在父进程被杀死后,端口进入 TIME_WAIT 状态。操作系统最终将在大约 60 秒后完全关闭端口。这意味着您不能在至少 60 秒内重用端口(除非您为套接字提供重用选项)。
  • 在 Darwin 上,必须使用不同版本的 fuser。只取文件,不支持-k
  • 'fuser -k -n tcp 8080' 也会杀死进程
  • @dbliss fuser 是 psmisc 的一部分。如果您收到fuser: command not found,请安装 psmisc。对于 CentOS/RHEL 7,运行 sudo yum install psmisc
【解决方案2】:

列出任何监听 8080 端口的进程:

lsof -i:8080

杀死任何监听 8080 端口的进程:

kill $(lsof -t -i:8080)

或更猛烈:

kill -9 $(lsof -t -i:8080)

(-9 对应于SIGKILL - terminate immediately/hard kill 信号:参见List of Kill SignalsWhat is the purpose of the -9 option in the kill command?。如果没有为kill 指定信号,则发送TERM 信号又名-15soft kill,有时不足以杀死一个进程。)。

【讨论】:

  • kill:用法:kill [-s sigspec | -n 符号 | -sigspec] pid | jobspec ... 或 kill -l [sigspec] 这就是我执行命令时得到的结果
  • @SudhirBelagali 与超级用户 sudo 一起做吗
  • 在我的 Mac 上也可以使用
  • 我想补充一点,有时您没有权限查看进程ID,在这种情况下您需要执行sudo lsof -i:8080
  • 为什么第二个提示更暴力?
【解决方案3】:

使用命令

 sudo netstat -plten |grep java

使用grep java 作为tomcat 使用java 作为他们的进程。

它将显示带有端口号和进程ID的进程列表

tcp6       0      0 :::8080                 :::*                    LISTEN      
1000       30070621    16085/java

/java 之前的数字是进程 ID。现在使用kill 命令杀死进程

kill -9 16085

-9 表示进程将被强制终止。

【讨论】:

  • 您可能想补充一点,可能需要 root 权限才能通过 netstat 获取进程名称。
  • @JonasWielicki 你可以看到你拥有的没有root权限的人。
  • 我需要 netstat 的 root 权限。有没有办法真正知道这个过程是从哪里来的?据我所知,我已经关闭了所有应用程序,但它可能是来自我无意中将进程推送到后台任务的终端窗口。也许我应该先运行终端命令“ps”来查看所有进程...
  • sudo netstat -plten | grep :8080 即使在您不了解应用程序的情况下也可以使用。这发现了一个 lsof -i 没有为我找到的 ruby​​ 进程。
  • netstatthe deprecated alternativessHere 使用示例。
【解决方案4】:

选项 1 仅在特定端口上杀死 LISTEN 的单线:

kill -9 $(lsof -t -i:3000 -sTCP:LISTEN)`

选项2如果你安装了npm,你也可以运行

npx kill-port 3000

【讨论】:

  • 我认为这应该是最好的答案。谢谢@Gal Bracha
  • 这是最好的解决方案,因为它也不会杀死我的浏览器!
  • 基于这个答案,我在~/.bashrc:killp() { kill -9 $(lsof -t -i:"$1" -sTCP:LISTEN) } 中创建了一个函数,以便能够像这样使用它killp 3000。 (不要忘记为{ } 添加新行)
【解决方案5】:

一个班轮

kill -9 $(lsof -t -i tcp:8080)

此处说明:使用lsofkill的组合

root@localhost:~# lsof -i tcp:8080
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
java    23672 sine  238u  IPv6 3028222      0t0  TCP localhost:http-alt (LISTEN)

选择 pid 并使用 kill

kill 23672

【讨论】:

    【解决方案6】:

    您可以使用 lsof 命令。 让这里的端口号是8090

    lsof -i:8090
    

    此命令返回此端口上打开的进程列表。

    有点像……

    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    ssh 75782 eoin 5u IPv6 0x01c1c234 0t0 TCP localhost:8090 (LISTEN)
    

    要释放端口,杀死使用它的进程(进程ID是75782)...

    kill -9 75782
    

    这个对我有用。 这是原始帖子的链接:link

    【讨论】:

    • 要强制终止进程,您需要使用 -9,如 kill -9 75782;因为有时很少有进程不会被杀死
    【解决方案7】:

    如果你想杀死一个在 8080 端口上运行的进程,那么首先你需要找到 8080 端口的进程标识号(PID)然后杀死它。运行以下命令查找8080端口号PID:

    sudo lsof -t -i:8080
    

    这里,

    • sudo - 询问管理员权限(用户 ID 和密码)的命令。
    • lsof - 文件列表(也用于列出相关进程)
    • -t - 仅显示进程 ID
    • -i - 仅显示与互联网连接相关的进程
    • :8080 - 仅显示此端口号中的进程

    所以您现在可以使用以下命令轻松杀死您的 PID:

    sudo kill -9 <PID>
    

    这里,

    • kill - 杀死进程的命令
    • -9 - 强行

    您可以使用以下命令使用一个命令来终止特定端口上的进程:

    sudo kill -9 $(sudo lsof -t -i:8080)
    

    更多内容可以看下面的链接 How to kill a process on a specific port on linux

    【讨论】:

    • 谢谢伙计。 sudo kill -9 $(sudo lsof -t -i:8080) 为我工作
    • 太棒了,这是对我有用的命令,Ubuntu
    【解决方案8】:

    杀死特定端口上所有进程的最佳方法;

    kill -9 $(sudo lsof -t -i:8080)
    

    【讨论】:

    • 不 sudo 提示输入密码
    【解决方案9】:

    这会将&lt;port_number&gt; 上运行的所有内容的进程 ID 打印到标准输出:

    fuser -n tcp <port_number> 
    

    它还会将一些内容打印到 stderr,所以:

    fuser -n tcp <port_number> 2> /dev/null
    

    然后我们可以将这些进程 ID 提供给 kill 命令:

    sudo kill $(fuser -n tcp <port_number> 2> /dev/null)
    

    如果你经常这样做,你也可以把它放在一个函数中:

    function killport() {
        sudo kill $(fuser -n tcp $1 2> /dev/null)
    }
    

    【讨论】:

      【解决方案10】:

      要知道在特定端口上运行的服务的 pid:

      netstat -tulnap | grep :*port_num*
      

      您将获得该过程的描述。现在使用 kill 或 kill -9 pid。很容易被杀死。

      例如

      netstat -ap | grep :8080

      tcp6       0      0 :::8080       :::*    LISTEN      1880/java 
      

      现在:

      kill -9 1880
      

      记得以root运行所有命令

      【讨论】:

        【解决方案11】:

        获取任务的PID并杀死它。

        lsof -ti:8080 | xargs kill
        

        【讨论】:

        • 感谢您的回答。在 Mac OS 中运行非常流畅。你是最棒的。只需投票。
        • 也适用于端口范围,例如lsof -ti:8080-8089 | xargs kill
        【解决方案12】:

        首先你需要做的是运行(替换为你的端口号):

        fuser -k 3000/tcp
        

        这将释放端口。运行上述命令后运行:

        service docker restart
        

        你的问题已经解决了。

        【讨论】:

        • 最佳答案就在这里!
        • 好的答案谢谢它也对我有用
        • 谢谢大家,感谢?
        【解决方案13】:

        试试这样,

         sudo fuser -n tcp -k 8080
        

        【讨论】:

          【解决方案14】:

          选择端口号并在 netstat 命令中应用 grep,如下所示

          netstat -ap | grep :7070
          

          控制台输出

          tcp 0 0 :::7070 :::* LISTEN 3332/java

          根据PID(进程标识号)杀死服务

          kill -9 3332
          

          【讨论】:

            【解决方案15】:
            1. lsof -i tcp:8000 该命令列出8000端口运行的进程信息

            2. kill -9 [PID] 该命令杀死进程

            【讨论】:

            • 我只是注意到几周前我不小心投了反对票,如果您稍微修改一下答案,我应该可以将其删除
            【解决方案16】:

            Linux:如果你知道端口,你可以使用这个命令:

            netstat -plten | grep LISTEN | grep 8080
            

            AIX

            netstat -Aan | grep LISTEN | grep 8080
            

            然后取第一列(例如:f100050000b05bb8)并运行以下命令:

            rmsock f100050000b05bb8 tcpcb
            

            杀死进程。

            【讨论】:

              【解决方案17】:

              Linux:如果你知道端口,首先你可以找到这个命令的PID:

              netstat -tulpn 
              

              例子:-

               Local Address  Foreign Address  State    PID/Program name
              
                :::3000       :::*             LISTEN    15986/node 
              

              然后您执行 kill 进程。运行以下命令:

              杀死 -9 PID

              示例:-

              杀死 -9 15986

              【讨论】:

                【解决方案18】:

                运行以下命令查找8080端口号PID:

                sudo lsof -t -i:8080

                您现在可以使用以下命令轻松杀死您的 PID:

                sudo kill -9

                您可以使用以下命令使用一个命令来终止特定端口上的进程:

                sudo kill -9 $(sudo lsof -t -i:8000)

                【讨论】:

                  【解决方案19】:

                  您可以了解系统中所有正在运行的端口的列表及其详细信息(pid、地址等):

                  netstat -tulpn
                  

                  您可以通过在以下命令中提供端口号来了解特定端口号的详细信息

                  sudo netstat -lutnp | grep -w '{port_number}'
                  

                  例如:sudo netstat -lutnp | grep -w '8080' 详情如下:

                  Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
                  

                  如果你想使用 pid 杀死一个进程,那么kill -9 {PID}

                  如果您想使用端口号终止进程fuser -n tcp {port_number}

                  如果您无法访问,请使用sudo

                  【讨论】:

                    【解决方案20】:

                    kill -9 `fuser 8080/tcp|xargs -n 1`,此命令还会杀死使用 TCP 连接侦听端口 8080 的进程

                    【讨论】:

                      【解决方案21】:

                      只需运行此命令。不要忘记用你的端口替换portnumber ;)

                        kill -9 $(sudo lsof -t -i:portnumber)
                      

                      【讨论】:

                      • 大部分时间在mac中不需要sudo。
                      【解决方案22】:

                      这将杀死在端口 80 上运行的程序

                      sudo fuser -k 80/tcp
                      

                      【讨论】:

                        【解决方案23】:
                        sudo apt-get install psmisc (or sudo yum install psmisc)
                        sudo fuser 80/tcp
                        

                        结果: 80/tcp:1858 1867 1868 1869 1871

                        一一杀死进程

                        杀死 -9 1858

                        【讨论】:

                          【解决方案24】:

                          这是 Windows 的解决方案:

                          C:\Users\Niroshan>netstat -ano|findstr "PID :8080"
                          
                          Proto Local Address Foreign Address State PID
                          TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 18264
                          
                          taskkill /pid 18264 /f
                          

                          【讨论】:

                          • 这个问题是关于 Linux 的。
                          【解决方案25】:

                          我正在开发一个 Yocto Linux 系统,它有一组有限的可用 Linux 工具。我想终止使用特定端口 (1883) 的进程。

                          首先,要查看我们正在监听的端口,我使用了以下命令:

                          root@root:~# netstat -lt
                          Active Internet connections (only servers)
                          Proto Recv-Q Send-Q Local Address           Foreign Address         State       
                          tcp        0      0 0.0.0.0:hostmon         0.0.0.0:*               LISTEN      
                          tcp        0      0 localhost.localdomain:domain 0.0.0.0:*               LISTEN      
                          tcp        0      0 0.0.0.0:9080            0.0.0.0:*               LISTEN      
                          tcp        0      0 0.0.0.0:1883            0.0.0.0:*               LISTEN      
                          tcp        0      0 :::hostmon              :::*                    LISTEN      
                          tcp        0      0 localhost:domain        :::*                    LISTEN      
                          tcp        0      0 :::ssh                  :::*                    LISTEN      
                          tcp        0      0 :::1883                 :::*                    LISTEN      
                          

                          接下来,我通过以下方式找到了使用1883端口的进程名:

                          root@root:~# fuser 1883/tcp
                          290 
                          root@root:~# ps | grep 290
                            290 mosquitt 25508 S    /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf
                          12141 root      8444 S    grep 290
                          

                          正如我们在上面看到的,是程序 /usr/sbin/mosquitto 使用了 1883 端口。

                          最后,我终止了进程:

                          root@root:~# systemctl stop mosquitto
                          

                          我使用了systemctl,因为在这种情况下它是一个系统服务。

                          【讨论】:

                            【解决方案26】:
                            1. 先检查进程netstat -lt
                            2. 检查进程IDfuser &lt;port number&gt;/tcp
                            3. 杀死在端口kill &lt;process id&gt;上运行的进程

                            【讨论】:

                              【解决方案27】:

                              Git Bash 的其他方式:

                              stopProcessByPortNumber() {
                              port=":${1}"
                              portStrLine="$(netstat -ano | findstr LISTENING | findstr $port)"
                              processId="$(grep -oP '(\d+)(?!.*\d)' <<< $portStrLine)"
                              echo $processId
                              taskkill -PID $processId -F
                              }
                              

                              【讨论】:

                                【解决方案28】:

                                就我而言,cent os 在建议的答案中存在一些问题。所以我使用了以下解决方案:

                                  ss -tanp | grep 65432 | head -1 | grep -Po "(?<=pid=).*(?=,)" | xargs kill
                                

                                【讨论】:

                                  【解决方案29】:

                                  以@veer7 所说的内容为基础:

                                  如果您想知道端口上有什么,请在杀死它之前执行此操作。

                                  $ sudo netstat -plten |grep java
                                  tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      1000       906726      25296/java      
                                  tcp6       0      0 :::8009                 :::*                    LISTEN      1000       907503      25296/java      
                                  tcp6       0      0 :::8080                 :::*                    LISTEN      1000       907499      25296/java      
                                  $ ps 25296
                                    PID TTY      STAT   TIME COMMAND
                                  25296 ?        Sl     0:16 /usr/lib/jvm/java-8-openjdk-amd64/bin/java -Dcatalina.base=/hom
                                  

                                  使用 'ps' 和 netstat 报告的进程号

                                  【讨论】:

                                    【解决方案30】:

                                    如果端口上的服务没有响应,如何杀死进程

                                    timeout 1 telnet localhost 8080 2>&1 | if grep -q 'Unable'; then sudo kill -9 $(sudo lsof -t -i:8080); fi
                                    

                                    它的作用

                                    1. 启动“超时”一秒,使 telnet 退出
                                    2. '2>&1 | ' 不退出的管道错误消息
                                    3. 如果错误消息包含“无法”,则运行 kode 以终止进程锁定端口 8080

                                    这可以放在一个文件中并从'sudo crontab'定期运行

                                    【讨论】:

                                      猜你喜欢
                                      • 1970-01-01
                                      • 2020-06-08
                                      • 2021-08-14
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 2012-03-09
                                      • 1970-01-01
                                      • 2012-04-07
                                      相关资源
                                      最近更新 更多