如何知道给定端口上正在监听的程序?


377

我怀疑程序正在侦听8000我机器上的端口。

当我运行以下命令时,出现此错误:

> python -m SimpleHTTPServer
# Lots of python error
socket.error: [Errno 98] Address already in use

如果我使用另一个端口(8000是默认端口),则Web服务器可以正常运行。

如果我从命令行运行wget localhost:8000,则返回404 Not Found

我该怎么做(或可用的工具)来查找正在port上侦听的程序8000,并从那里配置该程序?

Answers:


313

打开您的终端并输入

lsof -i :8000

该命令将列出您该端口使用PID的应用程序。(如果没有结果通过,sudo因为您可能没有权限访问某些进程。)

例如,使用端口8000(python3 -m http.server):

$ lsof -i :8000
COMMAND  PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
python3 3269 user    3u  IPv4 1783216      0t0  TCP *:8000 (LISTEN)

和端口22(SSH):

$ sudo lsof -i :22
COMMAND  PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
sshd     998 root    3u  IPv4 1442116      0t0  TCP *:ssh (LISTEN)
sshd     998 root    4u  IPv6 1442118      0t0  TCP *:ssh (LISTEN)

希望能有所帮助。


2
这也可以在OSX上
发挥作用,

2
添加-s TCP:LISTEN将结果限制为实际的侦听套接字及其过程。
jhermann

1
如果搜索端口8000,它将返回PID 1889?笏
CodyBugstein

是的,使用端口8881的PID 1889有服务。我丢失了什么吗?
rɑːdʒɑ

1
@表示示例搜索端口8881。PID列包含进程ID,而NAME列包含端口。
Freek de Bruijn 2015年

377

您可以使用netstat查看哪个进程正在侦听哪个端口。

您可以使用此命令来获取完整的详细信息:

sudo netstat -peanut

如果您需要确切地知道哪个正在监听8000端口,则可以使用以下命令:

sudo netstat -peanut | grep ":8000 "

没有可以从netstat隐藏的进程。


117
netstat -peanut比起记忆更容易netstat -taupen
道格拉斯·斯泰普

9
好一个!-只需编辑答案即可反映您的评论。谢谢。
Antoine Rodriguez

2
“ fuser -k 8000 / tcp”以释放该端口
Jay Modi

3
如果在“ PID /程序名称”列中看到的是破折号而不是进程名称,则您忘记添加“ sudo”
v.shashenko

3
所以是花生s
prusswan

172

要通过@ 33833阐明答案,您可以获取一些非常详细的信息,例如:

$ lsof -i :8000
COMMAND  PID  USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
squid3  1289 proxy   15u  IPv6 14810490      0t0  TCP *:8000 (LISTEN)

$ ps -fp 1289
UID        PID  PPID  C STIME TTY          TIME CMD
proxy     1289     1  0 09:48 ?        00:00:00 /usr/sbin/squid3 -N -f /etc/squid-deb-proxy/squid-deb-proxy.conf

我在那里可以看到鱿鱼是一个过程,但实际上是我squid-deb-proxy占据了港口。

Java应用程序的另一个好例子:

$ lsof -i :4242
COMMAND  PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
java    3075 root   86u  IPv4    12019      0t0  TCP *:4242 (LISTEN)

$ ps -fp 3075
UID        PID  PPID  C STIME TTY          TIME CMD
root      3075     1 15 May24 ?        3-16:07:25 /usr/local/crashplan/jre/bin/java -Dfile.encoding=UTF-8 -Dapp=CrashPlanService -DappBaseName=CrashPl

您可以在lsof(LiSt打开文件)中看到它是Java,这没有什么用。ps使用PID 运行命令,我们可以立即看到它是CrashPlan。


9
在一项命令中:lsof -t -i :8000 | xargs ps -fp
Brett Y

8
我必须加上前缀,sudo 但之后对我有用。谢谢。
Dwayne Crooks

4
注意:没有sudo错误就不会得到任何回应。
Frank Nocke


6

使用socklistfrom procinfo包的另一种方式:

man socklist

description
socklist是一个Perl脚本,它为您提供所有打开的套接字的列表,枚举类型,端口,inode,uid,uid,pid,fd及其所属的程序。

sudo socklist

type  port      inode     uid    pid   fd  name
tcp     53      28749       0   1721    5  dnsmasq
tcp    631      29190       0   2433   11  cupsd
tcp  42376      82230    1000   1345   84  firefox
tcp  49048      71686    1000   1345   67  firefox
tcp  41248      81672    1000   1345  119  firefox
tcp  54676      84558    1000   1345   73  firefox
udp  56107      66258       0   3268   20  dhclient
udp  40804      17857     107    679   14  avahi-daemon
udp     53      28748       0   1721    4  dnsmasq
udp     68      67427       0   3268    6  dhclient
udp    631      19692       0    765    8  cups-browsed
udp   5353      17855     107    679   12  avahi-daemon

2

您可以使用nmap。

知道您的PC中打开了哪些端口非常重要,这不仅对Linux有用,对于其他操作系统也是如此。Linux有很多工具可以检查哪些端口是打开的,最常见的是nmap,这是一个命令行工具,但如果您愿意,也可以使用它的图形前端。1个

要安装它,只需按键盘上的Ctrl+ Alt+ T打开终端。打开时,运行以下命令:

sudo apt-get install nmap

有关nmap和其他实用程序的更多信息,请转到此处

1资料来源: garron.me


nmap只会告诉您哪个端口已打开,而不是哪个进程打开了它。
Andrew Burns 2014年

1
我单击浏览您的源代码,[nmap] tries to guess which service is listening on each port, but it can make mistakes然后才建议使用一种实际的方法来找出哪个进程拥有套接字。
GnP 2014年

@gnp您可能还想看看This
米奇

@米奇我做到了。OP需要知道本地系统上进程的确切PID。Nmap在这里不是正确的工具,甚至没有服务和版本检测。它要么与nmaps数据库中的某个项目相匹配,要么仍使OP知道如何终止或重新配置哪个进程,否则它将
不为所动
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.