这是我想杀死的进程:
sooorajjj@Treako ~/Desktop/MerkMod $ sudo netstat -tunap | grep :80
tcp6 0 0 :::80 :::* LISTEN 20570/httpd
答案1
有多种方法可以查找哪个正在运行的进程正在使用端口。
使用 fusionr 它将给出与侦听端口关联的多个实例的 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
答案2
这是一个显示要运行的命令的单行代码:
echo kill $(sudo netstat -anp | awk '/ LISTEN / {if($4 ~ ":80$") { gsub("/.*","",$7); print $7; exit } }')
替换echo
为sudo
实际要终止的进程。
答案3
提供了列出开放端口的三个选项杰什的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
withnetstat
或 withlsof
来使用-sTCP:LISTEN
,但我喜欢上面的 grep,因为它们会还赶上外向的連接从给定的端口,有时可能会引起兴趣。)
随着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
然而,使用正则表达式时通常有可能出现误报,因此我建议仅查看初始输出,netstat
然后手动决定是否运行:
$ kill -KILL 1914
也可以看看
我有另一个脚本叫listopenports
这可能是有趣的。