답변:
기본 포트 (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 이상이면됩니다.
sudo kill -9 PID
kill
프로세스에 신호를 보내면 처리를 결정할 수 있습니다 (예 : 정상적으로 종료 또는 로그 파일 회전). 이러한 신호는 정수 (각각 이름이 있음)이며 기본값은 15이며 의미는 TERM
또는 종료됩니다 . -9를 사용하면 신호 9를 보내는데,이 신호 KILL
는 프로세스 가 포착하고 무시할 수 없으며 OS는 원하는 프로세스를 종료합니다.
간단한 해결책 :
포트를 사용하여 프로세스를 찾으십시오 8080
.
sudo lsof -i:8080
죽여:
kill XXXX
lsof
출력 결과 의 예와 출력 내에서 프로세스 ID ( "XXXX"나열)를 찾는 방법 의 이점을 얻을 수 있습니다. 해당 정보없이이 정보를 보는 사람은 "PID"헤더 레이블 아래 출력의 두 번째 필드입니다.
파이썬에서 다음과 같이 가장 높은 사용 가능한 포트에서 서비스를 제공 할 수도 있습니다.
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 접근 방식만큼 신뢰할 수는 없습니다. 다른 프로세스는 프로세스가 수행되기 전에 포트를 잡을 수 있지만 (경주 조건)- 그 자체로 시도해 볼 수있는 접근 방식이 없습니다.
서버에서로 주소를 재사용 할 수 있습니다 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()
python -m SimpleHTTPServer 8081