সকেট.অররার: [ত্রুটিযুক্ত 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 নির্দিষ্ট করে? এমনকি সুডো ম্যানুয়াল এই প্যারামিটারটি আবরণ করে বলে মনে হচ্ছে না sudo.ws/man/sudo.man.html
seokhoonlee

3
@ সিওখুনলি: killপ্রক্রিয়াটিতে একটি সংকেত প্রেরণ করে, যা এটি পরিচালনা করার সিদ্ধান্ত নিতে পারে (যেমন নিখুঁতভাবে শাট ডাউন বা লগফাইলে ঘোরানো)। এই সংকেতগুলি পূর্ণসংখ্যা (প্রতিটি নামের সাথে), ডিফল্ট হ'ল 15, অর্থ TERMবা সমাপ্তি । -9 ব্যবহার করে সিগন্যাল 9 প্রেরণ করা হয় KILL, যা কোনও প্রক্রিয়া ধরতে এবং উপেক্ষা করতে পারে না এবং ওএস প্রক্রিয়াটি তার পছন্দ বা পছন্দ না করেই শেষ করবে।
মার্টিজন পিটারস


153

সহজ সমাধান :

  1. পোর্ট ব্যবহার করে প্রক্রিয়াটি সন্ধান করুন 8080:

    sudo lsof -i:8080

  2. এটাকে হত্যা কর:

    kill XXXX


8
এই উত্তরটি lsofআউটপুটটি কেমন দেখাচ্ছে এবং আউটপুটটির মধ্যে কীভাবে প্রক্রিয়া আইডি (আপনার তালিকাভুক্ত "XXXX") খুঁজে পাবেন তার উদাহরণ থেকে উপকৃত হবে । এই তথ্যটি যে কারও কাছে এটি দেখার জন্য, এটি "পিআইডি" এর শিরোনাম লেবেলের আউটপুটটির দ্বিতীয় ক্ষেত্র।
লিন্ডেস

2
@ লিন্ডস আপনি একটি ক্র্যাক!
কার্লোস রদ্রিগেজ

@ কার্লোস রড্র্যাগিউজ: হাহ? আপনি সেই মন্তব্যে আপনি কী বোঝাতে চেয়েছেন তা সত্য জানি না (আমি "ক্র্যাক" এর একাধিক সংজ্ঞা জানি, এবং আমি যেগুলি জানি সেগুলি খাপ
খায়

2
পছন্দ করেছেন আমি মনে করি lsof এর আউটপুট এবং PID কীভাবে সনাক্ত করতে হবে তার নমুনা দেওয়ার প্রয়োজনীয়তার উপর আপনার পর্যবেক্ষণটি খুব গুরুত্বপূর্ণ। প্রত্যাবর্তিত প্রতিটি সারির দ্বিতীয় আইটেমটি সাধারণত পিআইডি হয়, এটি সর্বদা আউটপুটটির পিআইডি কলামের অধীনে থাকে
কুদেহিনবু ওলুওয়াপোনলে

32

ব্যবহার

 sudo lsof -i:5000

এটি আপনাকে যদি কোনও বন্দর ব্যবহার করে প্রক্রিয়াগুলির একটি তালিকা দেয় give প্রক্রিয়াগুলির তালিকা দেওয়া হয়ে গেলে, পিআইডি কলামে আইডিটি প্রক্রিয়াটির ব্যবহারটি শেষ করতে ব্যবহার করুন

 kill 379 #use the provided PID

বিশেষ করে Mac 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)

এটি নেটিভ পাইথন পদ্ধতির মতো নির্ভরযোগ্য নয় কারণ বাশ স্ক্রিপ্টটি বন্দরটি ক্যাপচার করে না - আপনার প্রক্রিয়াটি (জাতিগত অবস্থা) করার আগে আরেকটি প্রক্রিয়া পোর্টটি ধরে ফেলতে পারে - তবে 'ইউটিলিটি' ব্যবহার না করে এখনও যথেষ্ট কার্যকর হতে পারে একটি নিজস্ব চেষ্টা করে দেখুন চেষ্টা করুন।


6

আমি পাইথনে নতুন, তবে আমার সংক্ষিপ্ত গবেষণার পরে আমি জানতে পারলাম যে এটি সকেটের সাথে বাঁধাই করা সাধারণ। এটি ঠিক তাই ঘটে যে সকেটটি এখনও ব্যবহৃত হচ্ছে এবং এটি ব্যবহারের জন্য আপনাকে অপেক্ষা করতে হতে পারে। বা, আপনি কেবল যোগ করতে পারেন:

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

এটি স্বল্প সময়ের মধ্যে বন্দরটি উপলব্ধ করা উচিত। আমার ক্ষেত্রে এটি বন্দরটি প্রায় সাথে সাথে উপলব্ধ করে।


4

উপরের সমাধানগুলি কার্যকর না হলে কেবল:

  1. আপনার প্রক্রিয়াটি যে পোর্টটি শুনছে তা পান:

    $ PS কুড়ালি | গ্রেপ পাইথন

  2. প্রক্রিয়া হত্যা

    PRO PROCESS_NAME কে হত্যা করুন


3

আমার একটি রাস্পবেরি পাই রয়েছে এবং আমি পাইথন ওয়েব সার্ভার ব্যবহার করছি (ফ্লাস্ক ব্যবহার করে)। আমি উপরের সমস্ত কিছু চেষ্টা করে দেখেছি, এর একমাত্র সমাধান হ'ল টার্মিনাল (শেল) বন্ধ করে আবার খুলতে হবে open বা রাস্পবেরি পাই পুনরায় চালু করুন , কারণ কোনও কিছুই সেই ওয়েবসভারটি থামায় না ...


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()
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.