如何终止在Linux中特定端口上运行的进程?


757

我试图使用./shutdown.shtomcat /bin目录关闭tomcat 。但是发现服务器没有正确关闭。因此,我无法重新启动
。tomcat在port上运行8080

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


Answers:


933

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

fuser -k 8080/tcp将终止该过程。

仅适用于Linux。通用性更高(使用lsof -i4IPv6或使用6)。


2
这也会关闭可能连接到8080的插座吗?
2014年

9
它无法正确关闭端口。终止父进程后,端口将进入TIME_WAIT状态。然后,操作系统将在大约60秒后最终完全关闭端口。这意味着您至少60秒内不能重用该端口(除非您为套接字提供了重用选项)。
Mark Lakata

2
在达尔文市,必须使用的其他版本fuser。仅带一个文件,不支持-k
美联社

3
'fuser -k -n tcp 8080'也将
终止

7
@dbliss热熔器是psmisc的一部分。如果得到fuser: command not found,请安装psmisc。对于CentOS / RHEL 7,运行sudo yum install psmisc
Tom

699

列出监听端口8080的所有进程:

lsof -i:8080

要终止监听端口8080的任何进程,请执行以下操作:

kill $(lsof -t -i:8080)

或更猛烈地:

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

-9对应于SIGKILL - terminate immediately/hard kill信号:请参见Kill Signals列表以及kill命令中-9选项的用途是什么?。如果未将信号指定给kill,则发送TERM信号aka -15soft kill发送,这有时不足以杀死一个过程。)。


9
杀死:用法:杀死[-s sigspec | -n signum | -sigspec] pid | jobspec ...或kill -l [sigspec]这是执行命令时得到的信息
Sudhir Belagali

2
@SudhirBelagali和超级用户一起完成了它sudo
Marcel Djaman

5
也可以在我的Mac上使用
asherbar '18

2
我想补充一点,有时您没有权限查看进程ID,在这种情况下,您需要这样做sudo lsof -i:8080
Akavall

1
为什么第二个提示更暴力?
Webwoman

281

使用命令

 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 意味着该过程将被强行杀死。


11
您可能想补充一点,可能需要root特权才能通过来获取进程名称netstat
乔纳斯·谢弗(JonasSchäfer)2012年

2
@JonasWielicki,您可以看到没有root特权的用户。
dbliss

我需要netstat的root特权。有没有一种方法可以真正知道该过程来自何处?据我所知,我已经关闭了所有应用程序,但可能是从终端窗口中无意中将进程推到了后台任务。也许我应该先运行终端命令“ ps”以首先查看所有进程……
JesseBoyd

150

我将添加此单线以仅杀死特定端口上的LISTEN:

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


9
我认为这应该是最好的答案。感谢@Gal Bracha
Sam Kah Chiin

2
这是最好的解决方案,因为它也不会杀死我的浏览器!
Russo

最佳答案!简单,简洁,可以正确完成工作。
沙皇Bomba

116

您可以使用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

这个为我工作。这是原始帖子的链接链接


1
要强行终止进程,您将需要使用-9,例如kill -9 75782;因为有时很少有一些进程不是仅仅杀死就杀死了
veer7

73

如果要终止在端口号8080上运行的进程,则首先需要找到8080端口进程标识号(PID),然后终止它。运行以下命令以找到8080端口号PID:

sudo lsof -t -i:8080

这里,

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

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

sudo kill -9 <PID>

这里,

  • kill-命令杀死进程
  • -9-强制

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

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

有关更多信息,请参见以下链接 如何在Linux上的特定端口上终止进程


谢了哥们。sudo kill -9 $(sudo lsof -t -i:8080)为我工作
Junaid


41

这将打印出stdout上运行的所有进程的进程ID <port_number>

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)
}


34

要知道在特定端口上运行的服务的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


25

一支班轮

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

这里的解释:结合使用 lsof and kill

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


16

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

netstat -ap | grep :7070

控制台输出

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

根据PID(进程标识号)终止服务

kill -9 3332

13
  1. lsof -i tcp:8000 此命令列出了有关在端口8000中运行的进程的信息

  2. kill -9 [PID] 该命令终止进程


我只是注意到,几周前我无意中对它进行了投票,如果您稍微修改一下anwer,我应该可以删除它
Robin-Hoodie,

12

Linux:首先,如果您知道端口,则可以找到此命令的PID:

netstat -tulpn 

例:-

 Local Address  Foreign Address  State    PID/Program name

  :::3000       :::*             LISTEN    15986/node 

然后,您执行杀死过程。运行以下命令:

杀死-9 PID

范例:-

杀死-9 15986


10

Linux:如果知道端口,则可以使用此命令:

netstat -plten | grep LISTEN | grep 8080

AIX

netstat -Aan | grep LISTEN | grep 8080

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

rmsock f100050000b05bb8 tcpcb

杀死进程。


10

您可以知道系统中运行的所有端口的列表及其详细信息(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,如果你不能够访问任何。


6

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


4
sudo apt-get install psmisc (or sudo yum install psmisc)
sudo fuser 80/tcp

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

一一杀死进程

杀死-9 1858


2

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

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

2

我正在使用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在这种情况下使用它,因为它是一个systemd服务。


1

以@ 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报告的进程号


1

使用Git Bash的其他方法:

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


-3

在Windows中,它将netstat -ano | grep "8080"得到以下消息TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 10076

我们可以使用以下方法杀死PID taskkill /F /PID 10076


问题显然是在寻求Linux帮助。不是Windows。
babycakes '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.