如何杀死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 信号又名-15
或soft 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)
此处说明:使用lsof
和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
【讨论】:
【参考方案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】:这会将<port_number>
上运行的所有内容的进程 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 <port number>/tcp
杀死在端口kill <process id>
上运行的进程
【讨论】:
【参考方案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中特定端口上运行的进程?的主要内容,如果未能解决你的问题,请参考以下文章
是否有可能在python中杀死正在侦听特定端口的进程,例如8080?