socket.error:[Errno 48]地址已被使用

irm*_*irm 196 python macos simplehttpserver

我正在尝试从mac终端设置一个带python的服务器.

我导航到文件夹位置使用:

python -m SimpleHTTPServer
Run Code Online (Sandbox Code Playgroud)

但这给了我错误:

socket.error: [Errno 48] Address already in use
Run Code Online (Sandbox Code Playgroud)

我以前使用相同的命令为我机器中不同位置的不同网站打开连接.

Mar*_*ers 328

您已经有一个绑定到默认端口(8000)的进程.如果您之前已经运行过相同的模块,那么很可能该进程仍然绑定到该端口.首先尝试找到其他进程:

$ ps -fA | grep python
  501 81651 12648   0  9:53PM ttys000    0:00.16 python -m SimpleHTTPServer
Run Code Online (Sandbox Code Playgroud)

包含命令参数,因此SimpleHTTPServer如果有多个python进程处于活动状态,您可以发现正在运行的参数.您可能希望测试是否http://localhost:8000/仍显示本地文件的目录列表.

第二个数字是进程号; 通过发送信号来停止服务器:

kill 81651
Run Code Online (Sandbox Code Playgroud)

这发送标准SIGTERM信号; 如果该过程没有响应,您可能不得不求助于更强硬的方法,例如发送SIGKILL(kill -s KILL <pid>kill -9 <pid>)信号.有关详细信息,请参阅Wikipedia.

或者,通过在命令行上指定备用端口,在不同的端口上运行服务器:

$ python -m SimpleHTTPServer 8910
Serving HTTP on 0.0.0.0 port 8910 ...
Run Code Online (Sandbox Code Playgroud)

然后访问服务器http://localhost:8910; 其中8910可以是1024及以上的任何数字,只要该端口尚未被采用.

  • 可能需要使用`sudo kill -9 PID` (9认同)
  • 谢谢,@Danpe,我尝试了“sudo Kill PID”,但不起作用,但“sudo Kill -9 PID”杀死了该进程。有人知道-9指定什么吗?即使 sudo 手册似乎也没有涵盖这个参数 https://www.sudo.ws/man/sudo.man.html (3认同)
  • @seokhoonlee:`kill`向进程发送一个信号,它可以决定处理(比如正常关闭或旋转日志文件).这些信号是整数(每个都有一个名称),默认值为15,表示"TERM"或*terminate*.使用-9发送信号9,`KILL`,进程*不能*捕获和忽略,操作系统将结束它喜欢或不喜欢的进程. (2认同)

小智 130

简单方案:

  1. 使用端口查找进程8080:

    sudo lsof -i:8080

  2. 杀死它:

    kill XXXX

  • 这个答案将受益于`lsof`输出可能是什么样子的例子,以及如何在输出中找到进程ID(列出的"XXXX").对于没有该信息的任何人看到这个,它是输出中的第二个字段,在标题标签"PID"下. (7认同)
  • @lindes你真是个裂缝! (2认同)
  • @CarlosRodríguez 我想相信他绝对正确地找到了您的回复。我认为您对提供 lsof 输出样本的必要性以及如何识别 PID 的观察非常重要。返回的每一行的第二项通常是PID,它总是在输出的PID列下 (2认同)

can*_*man 25

使用

 sudo lsof -i:5000
Run Code Online (Sandbox Code Playgroud)

这将为您提供使用端口的进程列表(如果有).一旦给出了进程列表,使用PID列上的id来终止进程使用

 kill 379 #use the provided PID
Run Code Online (Sandbox Code Playgroud)


Mar*_*pel 14

顺便说一下,为了防止这种情况发生,只需在SimpleHTTPServer仍然正常运行时按Ctrl+ C终端.这将"正确"停止服务器并释放端口,因此您无需在重新启动服务器之前再次查找并终止该进程.

(Mods:我确实试着将这个评论放在它所属的最佳答案上,但我没有足够的声誉.)

  • 这里有有用的信息,我无意识地按了 Ctrl+Z,进程就保持活动状态。Ctrl+C 释放端口,因此无需手动终止它。 (2认同)

Mic*_*mid 8

您可以允许服务器使用allow_reuse_address.

服务器是否允许重用地址。这默认为False,并且可以在子类中设置以更改策略。

import SimpleHTTPServer, SocketServer
PORT = 8000
httpd = SocketServer.TCPServer(("", PORT), SimpleHTTPServer.SimpleHTTPRequestHandler)
httpd.allow_reuse_address = True
print "Serving at port", PORT
httpd.serve_forever()
Run Code Online (Sandbox Code Playgroud)


Chr*_*son 7

您还可以在Python中使用下一个最高可用端口进行此类操作:

import SimpleHTTPServer
import SocketServer

Handler = SimpleHTTPServer.SimpleHTTPRequestHandler

port = 8000
while True:
    try:
        httpd = SocketServer.TCPServer(('', port), Handler)
        print 'Serving on port', port
        httpd.serve_forever()
    except SocketServer.socket.error as exc:
        if exc.args[0] != 48:
            raise
        print 'Port', port, 'already in use'
        port += 1
    else:
        break
Run Code Online (Sandbox Code Playgroud)

如果你需要为其他实用程序做同样的事情,它可能作为bash脚本更方便:

#!/usr/bin/env bash

MIN_PORT=${1:-1025}
MAX_PORT=${2:-65535}

(netstat -atn | awk '{printf "%s\n%s\n", $4, $4}' | grep -oE '[0-9]*$'; seq "$MIN_PORT" "$MAX_PORT") | sort -R | head -n 1
Run Code Online (Sandbox Code Playgroud)

将其设置为具有名称的可执行文件,get-free-port您可以执行以下操作:

someprogram --port=$(get-free-port)
Run Code Online (Sandbox Code Playgroud)

这不像本机Python方法那样可靠,因为bash脚本不捕获端口 - 另一个进程可以在进程执行之前抓取端口(竞争条件) - 但是当使用不具备的实用程序时仍然可能有用.它有自己的尝试再尝试方法.


Dee*_*pta 7

跟我一起案例

当我调试或运行服务器并且完成后,Terminating我而不是进程时,就会发生这种情况Disconnect

当我们在服务器仍在运行时尝试关闭 PyCharm 时,PyCharm 会要求提供这两个选项

这会导致该进程仍在该特定地址的后台运行,因此会出现Address already in use错误。

解决方案

pkill python
Run Code Online (Sandbox Code Playgroud)

对我有用。

另一种情况-多进程

如果您有多个使用 python 运行的服务器/应用程序(显然,在不同的端口),则使用it获取PIDPORTkill该进程的。

sudo lsof -i :5000 # here 5000 is the port number  

| COMMAND | PID    | USER     | FD | TYPE | DEVICE | SIZE/OFF | NODE | NAME                    |
|---------|--------|----------|----|------|--------|----------|------|-------------------------|
| python  | 185339 | username | 7u | IPv4 | 598745 | 0t0      | TCP  | localhost:5000 (LISTEN) |
| python  | 185348 | username | 7u | IPv4 | 598745 | 0t0      | TCP  | localhost:5000 (LISTEN) |
| python  | 185350 | username | 8u | IPv4 | 598745 | 0t0      | TCP  | localhost:5000 (LISTEN) |


kill -9 185339 # here 185339 is the PID from above output; keep the -9 as it is
Run Code Online (Sandbox Code Playgroud)

检查@Andrew的答案以防止将来出现这种情况。

参考文献:kill命令kill/pkill/killalllsof

合十礼


小智 6

我是Python的新手,但经过简短的研究,我发现这是绑定套接字的典型代表。碰巧的是,套接字仍在使用中,您可能必须等待使用它。或者,您可以添加:

tcpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Run Code Online (Sandbox Code Playgroud)

这将使端口在较短的时间内可用。就我而言,它几乎可以立即使端口可用。


小智 5

以防万一上述解决方案不起作用:

  1. 获取您的进程正在侦听的端口:

    $ ps ax | 蟒蛇

  2. 杀死进程

    $杀死PROCESS_NAME


小智 5

简单的一行命令即可删除它,在终端中键入以下命令,

ps -a
Run Code Online (Sandbox Code Playgroud)

这将列出所有进程,签出Python正在使用的结账,并在终端中键入bellow命令,

kill -9 (processID) 
Run Code Online (Sandbox Code Playgroud)

例如杀死-9 33178

  • 在 MacOSX 上工作(我不知道这是否相关),但我必须使用“-9”参数才能使其工作。这是唯一提到这一点的答案。 (3认同)

归档时间:

查看次数:

305385 次

最近记录:

6 年,1 月 前