终止在端口80上运行的进程


14

这是我要杀死的过程:

sooorajjj@Treako ~/Desktop/MerkMod $ sudo netstat -tunap | grep :80
tcp6    0   0 :::80   :::*     LISTEN    20570/httpd

Answers:


31

有几种方法可以找到正在使用端口的运行进程。

使用热熔器,它将给出与侦听端口关联的多个实例的PID。

sudo apt-get install psmisc
sudo fuser 80/tcp

80/tcp:               1858  1867  1868  1869  1871

找出后,您可以停止或终止该进程。

您还可以使用lsof查找PID和更多详细信息

sudo lsof -i tcp:80

COMMAND  PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME  
nginx   1858     root    6u  IPv4   5043      0t0  TCP ruir.mxxx.com:http (LISTEN)  
nginx   1867 www-data    6u  IPv4   5043      0t0  TCP ruir.mxxx.com:http (LISTEN)  
nginx   1868 www-data    6u  IPv4   5043      0t0  TCP ruir.mxxx.com:http (LISTEN)  
nginx   1869 www-data    6u  IPv4   5043      0t0  TCP ruir.mxxx.com:http (LISTEN)  
nginx   1871 www-data    6u  IPv4   5043      0t0  TCP ruir.mxxx.com:http (LISTEN)  

要限制为侦听端口80的套接字(与连接到端口80的客户端相反):

sudo lsof -i tcp:80 -s tcp:listen

要自动杀死它们:

sudo lsof -t -i tcp:80 -s tcp:listen | sudo xargs kill

1
我想指出的是,热熔器还具有-k切换功能,可以杀死所有匹配的进程并-i以交互方式杀死(提示您每一个)。
A. Wilcox

7

这是显示要运行的命令的oneliner:

echo kill $(sudo netstat -anp | awk '/ LISTEN / {if($4 ~ ":80$") { gsub("/.*","",$7); print $7; exit } }')

替换echosudo,该过程实际上将被杀死。


替换echosudo
EliuX

这是一个完美的答案,我们只需要用替换端口号即可80
Youssof H.

4

上市开放端口三个选项均提供JSHwhatisonport

netstat -anp --numeric-ports | grep ":${PORT}\>.*:" 

fuser -v "${PORT}"/tcp

lsof -P -S 2 -i "tcp:${PORT}" | grep "\(:${PORT}->.*:\|:$PORT (LISTEN)$\)"

我喜欢netstat它,因为它快速,简洁,并且可以列出其他用户打开的端口。(尽管仍然需要超级用户/用户特权才能列出此类进程的名称和PID。)

产出

$ netstat -anp --numeric-ports | grep ":80\>.*:" 
tcp6       0      0 :::80           :::*            LISTEN      1914/apache2    

$ fuser -v "80/tcp"
                     USER        PID ACCESS COMMAND
80/tcp:              root       1914 F.... apache2
                     www-data  12418 F.... apache2
...

$ lsof -P -S 2 -i "tcp:80" | grep "\(:80->.*:\|:80 (LISTEN)$\)"
apache2  1914     root    4u  IPv6   11920      0t0  TCP *:80 (LISTEN)
apache2 12418 www-data    4u  IPv6   11920      0t0  TCP *:80 (LISTEN)
...

grep在两种情况下,使用的目的是仅匹配本地端的端口,并跳过与远程端口80的开放连接。(一种替代方法是-lnetstat或一起lsof使用-sTCP:LISTEN,但我喜欢上面的技巧,因为它们会还可以捕获来自给定端口的传出连接,这有时可能很有趣。)

lsof我们-P来显示:80而不是:http使grep成为可能。该-S 2选项强制lsof及时完成。

杀死进程

假设我们要使用netstat,我们可以像这样抓取PID:

$ netstat -anp --numeric-ports | grep ":80\>.*:" | grep -o "[0-9]*/" | sed 's+/$++'
1914
...

我们甚至可以将这些PID传递给kill

... | xargs -d '\n' kill -KILL

但是,在使用正则表达式时,通常可能会出现误报的情况,因此,我建议您仅查看regexp的初始输出,netstat然后手动决定是否运行:

$ kill -KILL 1914

也可以看看

我有另一个listopenports有趣的脚本。


3

您已经找到要杀死的进程:它是进程号20570,其二进制文件的名称httpd与的输出行的末尾所写的相同netstat。您可以按数字kill 20570或按名称杀死它,killall httpd但我不建议您这样做。

低于1024的端口具有标准用法(通常),您可以使用来查找那些端口和其他端口less /etc/services。端口80的条目甚至被注释:

http            80/tcp          www             # WorldWideWeb HTTP

因此,它很可能是网络服务器。您使用的名称是httpd并且man httpd应该给您一个大的提示,即适合的Apache二进制文件。Apache是​​其中的佼佼者,它提供了一些舒适的管理程序,但您并不需要它们仅仅是启动/停止操作。

你有薄荷糖吗?使用普通台式机?然后在Control Center下面查看System并单击Services。您需要成为管理员才能在该处执行任何操作。向下滚动,直到找到标有“ webserver”的东西(我用lighttpd代替Apache,并且不完全知道Apache条目的样子)并取消选中它。

如果您只是想暂时停止它,请尝试在控制台中

sudo service stop httpd

然后从开始sudo service start httpdservice --status-all返回所有service已知并且可以处理的服务的列表。对服务的重新启动快捷方式(即:停止,依次启动它)是service --full-restart SERVICESERVICE被服务,如:名称httpd中的Apache的情况下。

您找到的大多数程序都netstat可以通过这种方式处理。有些不能,有些甚至没有手册页,但是很少。


0

有一个简单的方法可以做到这一点。首先通过netstat检查哪个进程正在使用端口80 :

netstat -ntl | grep 80

现在,您获得了进程名称,并使用killall命令杀死该进程:

killall -9 process name

使用“ killall”命令会有什么危险?
彼得·莫滕森

2
-1表示killall没有解释或警告。
贡伯特

1
Killall有几个问题。除了能够在出现问题时使系统瘫痪之外,它还能杀死与端口无关的多个进程实例。最重要的是,killall的最大问题是,如果Solaris框中的某人尝试使用它,它将杀死所有正在运行的进程。
Rui F Ribeiro
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.