Answers:
有几种方法可以找到正在使用端口的运行进程。
使用热熔器,它将给出与侦听端口关联的多个实例的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
这是显示要运行的命令的oneliner:
echo kill $(sudo netstat -anp | awk '/ LISTEN / {if($4 ~ ":80$") { gsub("/.*","",$7); print $7; exit } }')
替换echo
为sudo
,该过程实际上将被杀死。
echo
为sudo
80
。
上市开放端口三个选项均提供JSH的whatisonport
:
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的开放连接。(一种替代方法是-l
与netstat
或一起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
有趣的脚本。
您已经找到要杀死的进程:它是进程号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 httpd
。service --status-all
返回所有service
已知并且可以处理的服务的列表。对服务的重新启动快捷方式(即:停止,依次启动它)是service --full-restart SERVICE
与SERVICE
被服务,如:名称httpd
中的Apache的情况下。
您找到的大多数程序都netstat
可以通过这种方式处理。有些不能,有些甚至没有手册页,但是很少。
有一个简单的方法可以做到这一点。首先通过netstat检查哪个进程正在使用端口80 :
netstat -ntl | grep 80
现在,您获得了进程名称,并使用killall命令杀死该进程:
killall -9 process name
killall
没有解释或警告。
-k
切换功能,可以杀死所有匹配的进程并-i
以交互方式杀死(提示您每一个)。