如何杀死Linux中特定端口上运行的进程?

Posted

技术标签:

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

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

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

【问题讨论】:

shell script to kill the process listening on port 3000? 的可能重复项 【参考方案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 Signals 和What 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​​ 进程。 netstat 是 the deprecated alternative 到 ss。 Here 使用示例。【参考方案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】:

    lsof -i tcp:8000 该命令列出8000端口运行的进程信息

    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】:
    先检查进程netstat -lt 检查进程IDfuser &lt;port number&gt;/tcp 杀死在端口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

它的作用

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

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

【讨论】:

以上是关于如何杀死Linux中特定端口上运行的进程?的主要内容,如果未能解决你的问题,请参考以下文章

linux查看进程命令

linux如何查看端口被哪个进程占用,并杀死相关进程?

linux如何查看端口被哪个进程占用,并杀死相关进程?

是否有可能在python中杀死正在侦听特定端口的进程,例如8080?

centos(linux) 下如何查看端口占用情况及杀死进程

小记:windows,Linux杀死端口进程命令