2013-09-28 9 views
117

मै मैक टर्मिनल से अजगर के साथ एक सर्वर स्थापित करने की कोशिश कर रहा हूं।सॉकेट। आतंक: [एर्नो 48] पता पहले से ही उपयोग में है

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

python -m SimpleHTTPServer 

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

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

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

+1

मारने अन्य प्रक्रिया को मारने या एक अलग पोर्ट के साथ इस एक चलाएँ: 'अजगर -m SimpleHTTPServer 8081' – Blender

उत्तर

217

आपके पास पहले से ही डिफ़ॉल्ट पोर्ट (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 for more details देखें।

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

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

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

+0

क्या यूआरएल क्या यह देखने के लिए ब्राउज़र में होना चाहिए कि यह काम कर रहा है या नहीं? मैं – irm

+0

@irm को परेशान करते हुए एक अलग बंदरगाह पर चल रहा हूं: 'http: // localhost: '। –

+5

को 'सुडो मार -9 पीआईडी' – Danpe

5

आप भी इस तरह अगले-उच्चतम उपलब्ध कुछ पायथन में बंदरगाह कर रही पर सेवा कर सकते हैं:

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) 

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

57

सरल समाधान:

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

    sudo lsof -i:8080

  2. यह मार:

    kill XXXX

+0

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

5

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

(मॉड: मैं सर्वश्रेष्ठ उत्तर जहां से वह संबंधित पर यह टिप्पणी रखने का प्रयास किया था, लेकिन मैं काफी प्रतिष्ठा नहीं है।)

6

lsof मैं का उपयोग करें: 5000 यह आपको की एक सूची दे देंगे यदि कोई हो तो पोर्ट का उपयोग कर प्रक्रिया करता है। एक बार प्रक्रियाओं की सूची दी गई है, इस प्रक्रिया को समाप्त करने के लिए पीआईडी ​​स्तंभ पर आईडी का उपयोग: जैसे 379

संबंधित मुद्दे