我怀疑有一个程序正在监听我的机器上的端口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
您可以通过以下方式检查这些命令的详细信息man
,help
或者我最喜欢的帮手