socket.error : [Errno 48] 이미 사용중인 주소


224

Mac 터미널에서 Python으로 서버를 설정하려고합니다.

폴더 위치로 이동하여 사용합니다.

python -m SimpleHTTPServer

그러나 이것은 나에게 오류를 준다 :

socket.error: [Errno 48] Address already in use

이전에 컴퓨터의 다른 위치에있는 다른 웹 사이트에 대해 동일한 명령을 사용하여 연결을 열었습니다.


2
다른 프로세스를 종료하거나 다른 포트로이 프로세스를 실행하십시오.python -m SimpleHTTPServer 8081
Blender

답변:


356

기본 포트 (8000)에 바인딩 된 프로세스가 이미 있습니다. 이전에 동일한 모듈을 이미 실행 한 경우 프로세스가 여전히 포트에 바인딩 된 것 같습니다. 다른 프로세스를 먼저 찾아보십시오.

$ ps -fA | grep python
  501 81651 12648   0  9:53PM ttys000    0:00.16 python -m SimpleHTTPServer

명령 인수가 포함되어 있으므로 SimpleHTTPServer둘 이상의 python프로세스가 활성화 된 경우 실행중인 프로세스 를 찾을 수 있습니다 . http://localhost:8000/여전히 로컬 파일의 디렉토리 목록이 표시 되는지 테스트 할 수 있습니다 .

두 번째 숫자는 프로세스 번호입니다. 신호를 보내 서버를 중지하십시오.

kill 81651

표준 SIGTERM신호를 보냅니다 . 프로세스가 응답하지 않으면 대신 SIGKILL( kill -s KILL <pid>또는 kill -9 <pid>) 신호를 보내는 것과 같은 더 어려운 방법을 사용해야 할 수도 있습니다 . 자세한 내용은 Wikipedia를 참조하십시오 .

또는,에 서버를 실행하는 다른 포트, 명령 행에서 대체 포트를 지정하여 :

$ python -m SimpleHTTPServer 8910
Serving HTTP on 0.0.0.0 port 8910 ...

그런 다음 서버에 액세스하십시오 http://localhost:8910. 여기서 8910포트를 아직 가져 오지 않은 경우 1024 이상이면됩니다.


작동하는지 확인하려면 브라우저에 어떤 URL이 있어야합니까? 당신이
자랐을

14
sudo kill -9 PID
Danpe

감사합니다, @ Danpe, 작동하지 않는 "sudo kill PID"를 시도했지만 "sudo kill -9 PID"가 프로세스를 종료했습니다. 누구든지 -9가 무엇을 지정하는지 알고 있습니까? sudo 매뉴얼 조차도이
seokhoonlee

3
@seokhoonlee : kill프로세스에 신호를 보내면 처리를 결정할 수 있습니다 (예 : 정상적으로 종료 또는 로그 파일 회전). 이러한 신호는 정수 (각각 이름이 있음)이며 기본값은 15이며 의미는 TERM또는 종료됩니다 . -9를 사용하면 신호 9를 보내는데,이 신호 KILL는 프로세스 포착하고 무시할 수 없으며 OS는 원하는 프로세스를 종료합니다.
Martijn Pieters

@seokhoonlee : Wikipedia 의 유닉스 신호 기사 도 참조하십시오 .
Martijn Pieters

153

간단한 해결책 :

  1. 포트를 사용하여 프로세스를 찾으십시오 8080.

    sudo lsof -i:8080

  2. 죽여:

    kill XXXX


8
이 답변은 lsof출력 결과 의 예와 출력 내에서 프로세스 ID ( "XXXX"나열)를 찾는 방법 의 이점을 얻을 수 있습니다. 해당 정보없이이 정보를 보는 사람은 "PID"헤더 레이블 아래 출력의 두 번째 필드입니다.
lindes

2
@lindes 당신은 균열입니다!
Carlos Rodríguez

@ CarlosRodríguez : 응? 나는 진정으로 당신이 그 의견 (... 내가 "균열"의 여러 정의를 알고, 내가 알고있는 사람이 적합하지 않는 것)에 의해 무슨 뜻인지 모르겠어요
lindes

2
@ CarlosRodríguez 나는 그가 당신의 응답을 절대적으로 발견했다고 믿고 싶습니다. lsof의 출력 샘플을 제공 할 필요성과 PID를 식별하는 방법에 대한 귀하의 관찰이 매우 중요하다고 생각합니다. 반환 된 각 행의 두 번째 항목은 그 출력의 PID 열에 항상 보통 PID 인
Kudehinbu Oluwaponle

32

사용하다

 sudo lsof -i:5000

포트가있는 경우 프로세스 목록을 제공합니다. 프로세스 목록이 제공되면 PID 열의 id를 사용하여 프로세스 사용을 종료하십시오.

 kill 379 #use the provided PID

즉, MAC OSX에 특히 작업 완벽하고 사용하지 않은 SO_REUSEPORT 대신 SO_REUSEADDR
SNR

16

그건 그렇고, 처음부터 이런 일이 발생하지 않도록하려면 Ctrl+ 를 누르십시오.C SimpleHTTPServer가 여전히 정상적으로 실행되는 동안 터미널에서 를 됩니다. 이렇게하면 서버가 "적절하게"중지되고 포트가 해제되므로 서버를 다시 시작하기 전에 프로세스를 다시 찾아서 종료 할 필요가 없습니다.

(Mods : 나는이 의견을 가장 좋은 답변에 넣으려고했지만 평판이 충분하지 않습니다.)


12

그것을 제거하는 간단한 한 줄 명령, 터미널에 아래 명령을 입력하십시오.

ps -a

이것은 모든 프로세스를 나열하고, 파이썬에서 사용중인 체크 아웃하고 터미널에 bellow 명령을 입력합니다.

kill -9 (processID) 

예를 들어 kill -9 33178


7

파이썬에서 다음과 같이 가장 높은 사용 가능한 포트에서 서비스를 제공 할 수도 있습니다.

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

다른 유틸리티에 대해 동일한 작업을 수행해야하는 경우 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

이름을 가진 실행 파일로 설정 get-free-port하면 다음과 같이 할 수 있습니다.

someprogram --port=$(get-free-port)

bash 스크립트는 포트를 캡처하지 않기 때문에 기본 Python 접근 방식만큼 신뢰할 수는 없습니다. 다른 프로세스는 프로세스가 수행되기 전에 포트를 잡을 수 있지만 (경주 조건)- 그 자체로 시도해 볼 수있는 접근 방식이 없습니다.


6

나는 파이썬을 처음 접했지만 간단한 연구를 한 후에 이것이 소켓이 묶이는 것이 일반적이라는 것을 알았습니다. 소켓이 여전히 사용되고 있으므로 소켓을 사용하기 위해 기다려야 할 수도 있습니다. 또는 다음을 추가 할 수 있습니다.

tcpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

이렇게하면 짧은 시간 내에 포트를 사용할 수있게됩니다. 필자의 경우 포트를 거의 즉시 사용할 수있게 만들었습니다.


4

위의 솔루션이 작동하지 않는 경우 :

  1. 프로세스가 수신 대기중인 포트를 가져 오십시오.

    $ ps 도끼 | grep python

  2. 프로세스 종료

    PROCESS_NAME 처치


3

나는 라즈베리 파이를 가지고 있으며, 파이썬 웹 서버 (Flask 사용)를 사용하고 있습니다. 위의 모든 것을 시도했지만 유일한 해결책은 터미널 (쉘)닫고 다시 여는 것입니다. 또는 아무것도 웹 서버를 멈추지 않기 때문에 라즈베리 파이를 다시 시작하십시오 ...


2

서버에서로 주소를 재사용 할 수 있습니다 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()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.