2013-09-28 213 views
117

Tôi đang cố gắng thiết lập máy chủ có python từ thiết bị đầu cuối mac.socket.error: [Errno 48] Địa chỉ đã được sử dụng

để điều hướng đến thư mục vị trí việc sử dụng:

python -m SimpleHTTPServer 

Nhưng điều này mang lại cho tôi lỗi:

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

Tôi đã từng mở một kết nối bằng cách sử dụng cùng một lệnh cho một trang web khác nhau trong một khác nhau vị trí trong máy của tôi.

+1

Giết quá trình khác hoặc chạy cái này với cổng khác: 'python -m SimpleHTTPServer 8081' – Blender

Trả lời

217

Bạn đã có một quá trình gắn với cổng mặc định (8000). Nếu bạn đã chạy cùng một mô-đun trước đó, rất có thể quá trình đó vẫn bị ràng buộc vào cổng. Hãy thử và xác định vị trí các quá trình khác đầu tiên:

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

Những lập luận lệnh được đưa vào, vì vậy bạn có thể nhận ra một trong những hoạt động SimpleHTTPServer nếu có nhiều hơn một python quá trình đang hoạt động. Bạn có thể muốn kiểm tra nếu http://localhost:8000/ vẫn hiển thị danh sách thư mục cho tệp cục bộ.

Số thứ hai là số quy trình; ngừng máy chủ bằng cách gửi cho nó một tín hiệu:

kill 81651 

Điều này sẽ gửi một tín hiệu tiêu chuẩn SIGTERM; nếu quá trình này không phản hồi, bạn có thể phải sử dụng các phương pháp khó khăn hơn như gửi tín hiệu SIGKILL (kill -s KILL <pid> hoặc kill -9 <pid>). Xem Wikipedia for more details.

Ngoài ra, chạy các máy chủ trên một cổng khác nhau , bằng cách xác định cổng thay thế trên dòng lệnh:

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

sau đó truy cập vào máy chủ như http://localhost:8910; trong đó 8910 có thể là bất kỳ số nào từ 1024 trở lên, miễn là cổng chưa được thực hiện.

+0

Url gì nên có trong trình duyệt để xem nó có hoạt động không? Tôi đang chạy trên một cổng khác khi bạn sugested – irm

+0

@irm: 'http: // localhost: '. –

+5

có thể cần phải sử dụng 'sudo kill -9 PID' – Danpe

5

Bạn cũng có thể phục vụ trên cổng làm một cái gì đó cao nhất kế tiếp có sẵn như thế này trong 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 

Nếu bạn cần phải làm điều tương tự cho các tiện ích khác, nó có thể thuận tiện hơn như một kịch bản 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 

thiết lập khả năng như một thực thi với tên get-free-port và bạn có thể làm một cái gì đó như thế này:

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

Điều đó không đáng tin cậy như phương pháp Python nguyên gốc bởi vì tập lệnh bash không chiếm cổng - một quá trình khác có thể lấy cổng trước khi quá trình của bạn thực hiện (điều kiện chủng tộc) - nhưng vẫn đủ hữu ích khi sử dụng tiện ích không có cách tiếp cận thử lại lần nữa.

57

Giải pháp đơn giản:

  1. Tìm quá trình sử dụng cổng 8080:

    sudo lsof -i:8080

  2. Giết nó:

    kill XXXX

+0

Câu trả lời này sẽ được hưởng lợi từ ví dụ về đầu ra 'lsof' trông như thế nào và cách tìm ID tiến trình (danh sách" XXXX "mà bạn liệt kê) trong đầu ra. Đối với bất cứ ai nhìn thấy điều này mà không có thông tin đó, đó là trường thứ hai trong đầu ra, dưới nhãn tiêu đề của "PID". – lindes

5

Nhân tiện, để ngăn điều này xảy ra ngay từ đầu, chỉ cần nhấn Ctrl + C trong thiết bị đầu cuối trong khi SimpleHTTPServer vẫn hoạt động bình thường. Điều này sẽ "đúng" ngăn chặn các máy chủ và phát hành các cổng, do đó bạn không cần phải tìm và giết quá trình một lần nữa trước khi khởi động lại máy chủ.

(Mods: Tôi đã cố gắng để đưa nhận xét này trên câu trả lời tốt nhất mà nó thuộc về, nhưng tôi không có đủ uy tín.)

6

Sử dụng lsof -i: 5000 này sẽ cung cấp cho bạn một danh sách các quy trình sử dụng cổng nếu có. Khi danh sách quy trình được đưa ra, sử dụng id trên cột PID để chấm dứt quá trình: ví dụ: giết 379