socket.error: [Errno 48] पहले से ही उपयोग में पता


224

मैं मैक टर्मिनल से अजगर के साथ एक सर्वर स्थापित करने की कोशिश कर रहा हूं।

मैं एक उपयोग फ़ोल्डर स्थान पर नेविगेट करता हूं:

python -m SimpleHTTPServer

लेकिन यह मुझे त्रुटि देता है:

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

मैंने पहले अपनी मशीन में एक अलग स्थान के लिए एक ही वेबसाइट के लिए एक ही कमांड का उपयोग करके एक कनेक्शन खोला था।


2
अन्य प्रक्रिया को मारें या इसे एक अलग बंदरगाह के साथ चलाएं:python -m SimpleHTTPServer 8081
ब्लेंडर

जवाबों:


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>) सिग्नल भेजने जैसे कठिन तरीकों का सहारा लेना पड़ सकता है । अधिक विवरण के लिए विकिपीडिया देखें ।

वैकल्पिक रूप से, कमांड लाइन पर वैकल्पिक पोर्ट को निर्दिष्ट करके, एक अलग पोर्ट पर सर्वर चलाएं :

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

उसके बाद सर्वर तक पहुंचें http://localhost:8910; जहां 89101024 और ऊपर से कोई भी संख्या हो सकती है, बशर्ते पोर्ट पहले से नहीं लिया गया हो।


मुझे यह देखने के लिए ब्राउज़र में क्या यूआरएल होना चाहिए कि क्या यह काम कर रहा है? मैं एक अलग बंदरगाह पर चल रहा हूँ के रूप में आप sugested
IRM

14
उपयोग करने की आवश्यकता हो सकती हैsudo kill -9 PID
Danpe

धन्यवाद, @ डैनेप, मैंने "सुडो किल पीआईडी" की कोशिश की, जो काम नहीं आया लेकिन "सुडो किल -9 पीआईडी" ने इस प्रक्रिया को मार दिया। किसी को पता है कि क्या -9 निर्दिष्ट करता है? यहां तक ​​कि सुडोल
seokhoonlee

3
@seokhoonlee: killप्रक्रिया को एक संकेत भेजता है, जिसे वह संभालना तय कर सकता है (जैसे इनायत बंद करना या लॉगऑफ़ को घुमाना)। ये संकेत पूर्णांक हैं (प्रत्येक नाम के साथ), डिफ़ॉल्ट 15 है, जिसका अर्थ है TERMया समाप्त । का उपयोग करते हुए -9 सिग्नल 9 भेजता है KILL, जो एक प्रक्रिया को पकड़ नहीं सकता है और अनदेखा कर सकता है , और ओएस उस प्रक्रिया को समाप्त कर देगा जो इसे पसंद करती है या नहीं।
मार्टिन पीटर्स

@ सियोखूनली: विकिपीडिया पर यूनिक्स संकेत लेख भी देखें ।
मार्टिन पीटर्स

153

सरल समाधान :

  1. पोर्ट का उपयोग कर प्रक्रिया खोजें 8080:

    sudo lsof -i:8080

  2. इसे मार:

    kill XXXX


8
यह उत्तर इस उदाहरण से लाभान्वित होगा कि lsofआउटपुट कैसा दिख सकता है, और आउटपुट के भीतर प्रक्रिया ID ("XXXX" सूची) कैसे प्राप्त करें। उस जानकारी के बिना इसे देखने वाले किसी के लिए, यह "पीआईडी" के हेडर लेबल के तहत आउटपुट में दूसरा क्षेत्र है।
lindes

2
@ लिंड्स आप एक दरार हैं!
कार्लोस रॉड्रिग्ज

@ कार्लोसरोडिग्ज: हुह? मैं वास्तव में नहीं जानता कि आप उस टिप्पणी (मैं "क्रैक" की कई परिभाषाएं पता है, और लोगों को मैं जानता हूँ कि फिट करने के लिए नहीं है ...) द्वारा क्या मतलब है
lindes

2
@ CarlosRodríguez मुझे विश्वास है कि वह आपकी प्रतिक्रिया बिंदु पर बिल्कुल पाया। मुझे लगता है कि lsof के आउटपुट के नमूने देने और PID की पहचान करने की आवश्यकता पर आपका अवलोकन बहुत महत्वपूर्ण है। लौटी प्रत्येक पंक्ति में दूसरा आइटम आमतौर पर PID होता है, यह हमेशा आउटपुट के PID कॉलम के अंतर्गत होता है
Kudehinbu Oluwaponle

32

उपयोग

 sudo lsof -i:5000

यह आपको पोर्ट का उपयोग करने वाली प्रक्रियाओं की सूची देगा यदि कोई हो। एक बार प्रक्रियाओं की सूची दिए जाने के बाद, प्रक्रिया उपयोग को समाप्त करने के लिए PID कॉलम पर आईडी का उपयोग करें

 kill 379 #use the provided PID

यही कारण है कि विशेष रूप से पर मैक OSX उन काम कर एकदम सही है, और उपयोग नहीं किया SO_REUSEPORT के बजाय SO_REUSEADDR
SNR

16

वैसे, इसे पहले स्थान पर होने से रोकने के लिए, बस टर्मिनल में Ctrl+ दबाएं Cजबकि सिम्पल टीटीपीएसवर अभी भी सामान्य रूप से चल रहा है। यह सर्वर को "ठीक से" बंद कर देगा और पोर्ट को जारी करेगा ताकि आपको सर्वर को पुनरारंभ करने से पहले प्रक्रिया को फिर से ढूंढना और मारना न पड़े।

(मॉड्स: मैंने इस टिप्पणी को सबसे अच्छे उत्तर पर रखने की कोशिश की, जहां यह है, लेकिन मेरे पास पर्याप्त प्रतिष्ठा नहीं है।)


12

इससे छुटकारा पाने के लिए सरल एक लाइन कमांड, टर्मिनल में कमांड के नीचे टाइप करें,

ps -a

यह सभी प्रक्रिया को सूचीबद्ध करेगा, चेकआउट जो कि पाइथन द्वारा उपयोग किया जा रहा है और टर्मिनल में टाइप कमांड है,

kill -9 (processID) 

उदाहरण के लिए किल -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

यदि आपको अन्य उपयोगिताओं के लिए एक ही काम करने की आवश्यकता है, तो यह बैश स्क्रिप्ट के रूप में अधिक सुविधाजनक हो सकता है:

#!/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)

यह मूल पायथन दृष्टिकोण के रूप में विश्वसनीय नहीं है क्योंकि बैश स्क्रिप्ट बंदरगाह पर कब्जा नहीं करती है - आपकी प्रक्रिया करने से पहले एक और प्रक्रिया बंदरगाह को पकड़ सकती है (दौड़ की स्थिति) - लेकिन फिर भी एक उपयोगिता का उपयोग करते समय पर्याप्त उपयोगी हो सकता है जो doesn ' t का स्वयं का एक प्रयास-पुनः दृष्टिकोण है।


6

मैं अजगर के लिए नया हूं, लेकिन अपने संक्षिप्त शोध के बाद मुझे पता चला कि यह सॉकेट्स के बंधे होने की खासियत है। यह सिर्फ इतना होता है कि सॉकेट का उपयोग अभी भी किया जा रहा है और आपको इसका उपयोग करने के लिए इंतजार करना पड़ सकता है। या, आप बस जोड़ सकते हैं:

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

इससे पोर्ट को कम समय में उपलब्ध होना चाहिए। मेरे मामले में, इसने पोर्ट को लगभग तुरंत उपलब्ध कराया।


4

बस उपरोक्त मामलों में समाधान काम नहीं आया:

  1. उस पोर्ट को प्राप्त करें जिसे आपकी प्रक्रिया सुन रही है:

    $ पीएस कुल्हाड़ी | ग्रेप पायथन

  2. प्रक्रिया को मार डालो

    $ PROCESS_NAME को मारें


3

मेरे पास रास्पबेरी पाई है, और मैं अजगर वेब सर्वर (फ्लास्क का उपयोग करके) का उपयोग कर रहा हूं। मैंने ऊपर सब कुछ करने की कोशिश की है, एकमात्र उपाय टर्मिनल (शेल) को बंद करना और इसे फिर से खोलना है। या रास्पबेरी पाई को पुनः आरंभ करें , क्योंकि कुछ भी उस वेबसर्वर को रोकता नहीं है ...


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()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.