Mac 터미널에서 Python으로 서버를 설정하려고합니다.
폴더 위치로 이동하여 사용합니다.
python -m SimpleHTTPServer
그러나 이것은 나에게 오류를 준다 :
socket.error: [Errno 48] Address already in use
이전에 컴퓨터의 다른 위치에있는 다른 웹 사이트에 대해 동일한 명령을 사용하여 연결을 열었습니다.
답변
기본 포트 (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 이상이면됩니다.
답변
간단한 해결책 :
-
포트를 사용하여 프로세스를 찾으십시오
8080
.sudo lsof -i:8080
-
죽여:
kill XXXX
답변
사용하다
sudo lsof -i:5000
포트가있는 경우 프로세스 목록을 제공합니다. 프로세스 목록이 제공되면 PID 열의 id를 사용하여 프로세스 사용을 종료하십시오.
kill 379 #use the provided PID
답변
그건 그렇고, 처음부터 이런 일이 발생하지 않도록하려면 Ctrl+ 를 누르십시오.C SimpleHTTPServer가 여전히 정상적으로 실행되는 동안 터미널에서 를 됩니다. 이렇게하면 서버가 “적절하게”중지되고 포트가 해제되므로 서버를 다시 시작하기 전에 프로세스를 다시 찾아서 종료 할 필요가 없습니다.
(Mods : 나는이 의견을 가장 좋은 답변에 넣으려고했지만 평판이 충분하지 않습니다.)
답변
그것을 제거하는 간단한 한 줄 명령, 터미널에 아래 명령을 입력하십시오.
ps -a
이것은 모든 프로세스를 나열하고, 파이썬에서 사용중인 체크 아웃하고 터미널에 bellow 명령을 입력합니다.
kill -9 (processID)
예를 들어 kill -9 33178
답변
파이썬에서 다음과 같이 가장 높은 사용 가능한 포트에서 서비스를 제공 할 수도 있습니다.
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 접근 방식만큼 신뢰할 수는 없습니다. 다른 프로세스는 프로세스가 수행되기 전에 포트를 잡을 수 있지만 (경주 조건)- 그 자체로 시도해 볼 수있는 접근 방식이 없습니다.
답변
나는 파이썬을 처음 접했지만 간단한 연구를 한 후에 이것이 소켓이 묶이는 것이 일반적이라는 것을 알았습니다. 소켓이 여전히 사용되고 있으므로 소켓을 사용하기 위해 기다려야 할 수도 있습니다. 또는 다음을 추가 할 수 있습니다.
tcpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
이렇게하면 짧은 시간 내에 포트를 사용할 수있게됩니다. 필자의 경우 포트를 거의 즉시 사용할 수있게 만들었습니다.