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

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

我怀疑有一个程序正在监听我的机器上的端口8000

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

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

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

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

我该做什么(或者使用什么工具)来找到哪个程序正在监听端口8000,以及该程序在哪里配置?

答案1

打开终端并输入

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

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

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

sudo netstat -peanut

如果你需要确切知道哪一个正在监听端口 8000,你可以使用这个:

sudo netstat -peanut | grep ":8000 "

没有任何进程能够躲过 netstat 的监视。

答案3

阐述@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 进程,但实际上是我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 Open Files)中看到它是 java,这没什么帮助。ps使用 PID 运行命令,我们可以立即看到它是 CrashPlan。

答案4

由于社区分数低,我无法在此发表评论。如果没有sudo上述所有命令,将不会为您提供进程 ID/程序名称。

因此,您需要输入以下内容:

sudo lsof -i :8000

或者

sudo netstat -lntup

您可以通过以下方式检查这些命令的详细信息manhelp或者我最喜欢的帮手

相关内容