Προσπαθώ να δημιουργήσω έναν διακομιστή με python από το τερματικό mac.
Πηγαίνω στη θέση του φακέλου και χρησιμοποιώ:
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 και πάνω, με την προϋπόθεση ότι η θύρα δεν είναι ήδη κατειλημμένη.
Απλή λύση:
`sudo lsof -i:8080`
`kill XXXX`
Μπορείτε επίσης να εξυπηρετείτε στην αμέσως υψηλότερη διαθέσιμη θύρα κάνοντας κάτι τέτοιο στην 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
Αν πρέπει να κάνετε το ίδιο πράγμα για άλλα βοηθητικά προγράμματα, μπορεί να είναι πιο βολικό ως σενάριο 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)
Αυτό δεν είναι τόσο αξιόπιστο όσο η εγγενής προσέγγιση της Python επειδή το σενάριο bash δεν καταγράφει τη θύρα -- μια άλλη διεργασία θα μπορούσε να καταλάβει τη θύρα πριν από τη δική σας διεργασία (race condition) -- αλλά μπορεί να είναι αρκετά χρήσιμο όταν χρησιμοποιείτε ένα βοηθητικό πρόγραμμα που δεν έχει μια δική του προσέγγιση try-try-again.