मैं "java.net.BindException: पता पहले से उपयोग में: JVM_Bind" त्रुटि कैसे हल करूं?


187

ग्रहण में, मुझे यह त्रुटि मिली:

run:
     [java] Error creating the server socket.
     [java] Oct 04, 2012 5:31:38 PM cascadas.ace.AceFactory bootstrap
     [java] SEVERE: Failed to create world : java.net.BindException: Address already in use: JVM_Bind
     [java] Java Result: -1
BUILD SUCCESSFUL
Total time: 10 seconds

मुझे यकीन नहीं है कि यह अब क्यों आया, लेकिन यह कुछ ही घंटे पहले ठीक चला। क्या मुझे अपनी मशीन को पुनः आरंभ करने की आवश्यकता है? मैं इसकी तह तक कैसे जाऊं? मैं किसी भी सुझाव या सलाह की सराहना करता हूं।


1
मैंने यह अक्सर विकास मशीनों पर देखा है जब आप कोड के परीक्षण चला रहे हैं - समस्या से कैसे बचा जा सकता है?
होगा

जवाबों:


141

हां, आपके पास उसी पोर्ट से जुड़ी एक और प्रक्रिया है।

जब भी मुझे JVM_BIND त्रुटि होती है, तो Windows Sysinternals से TCPView (केवल Windows) मेरा पसंदीदा ऐप है। यह दिखाता है कि कौन सी प्रक्रिया किस पोर्ट पर सुन रही है। यह प्रक्रिया को मारने या रास्ते में मिल रहे कनेक्शन को बंद करने के लिए एक सुविधाजनक संदर्भ मेनू भी प्रदान करता है।


एक त्वरित कार्य के आसपास: सर्वर दृश्य खोलें> सर्वर पर डबल क्लिक करें> उपयोग किए गए पोर्ट नंबर को बदल दें (जैसे कि टॉमकैट व्यवस्थापक, HTTP / 1.1, और AJP / 1.3 के लिए)
एड्रियन Be

2
@novice_developer netstatएक कमांड है जिसे आप -a और -p विकल्पों के साथ देख रहे हैं, man netstatक्या आप बाकी सभी के लिए अपने दोस्त हैं :)
मोनिका

1
यदि उपरोक्त प्रक्रिया काम नहीं कर रही है, तो एक बार पीसी को पुनरारंभ करें, मुझे लगता है कि यह काम करेगा। इसने मेरे मामले में काम करना शुरू कर दिया।
कुमार

195

आप जानते हैं कि बंदरगाह प्रक्रिया चल रहा है आप टाइप कर सकते हैं: lsof -i:<port>

उदाहरण के लिए, lsof -i:8080पोर्ट 8080 पर चलने वाली प्रक्रिया (पीआईडी) को सूचीबद्ध करने के लिए।

फिर के साथ प्रक्रिया को मार डालो kill <pid>


4
हाँ, यह linux है। फिर विंडोज में कुछ समतुल्य प्रयास करें। शायद यह मदद कर सकता है: stackoverflow.com/questions/15708/lsof-equivalent-for-windows
डिएगो पीनो

1
इसलिए मैं रास्पियन का उपयोग कर रहा हूं और यह कहता है: बैश: lsof: कमांड नहीं मिला। कोई सुझाव?
मोना जलाल

1
@ मोनाजलाल को यकीन नहीं हुआ लेकिन, शायद कुछ इस तरह की कोशिश करेंsudo apt-get install lsof
कॉफ़ी

@DiegoPino मैं उसी त्रुटि का सामना कर java.net.BindException: Address already in use (Bind failed) रहा हूं जिसका मैंने उपयोग किया lsof -i:8080और प्राप्त किया tcp6 0 0 :::8080 :::* LISTEN 106872/java। मुझे क्या करना चाहिए ? मार डालो जावा को ??
अविजीत बरूआ

@AvijitBarua इस पोर्ट से जुड़े जावा प्रोग्रामम की प्रोसेस आईडी (pid) 106872 है। आपके द्वारा लॉन्च किया गया हर जावा प्रोग्राम प्रोग्राम जावा के रूप में खुद को प्रस्तुत करता है (यह जावा वर्चुअल मशीन है जो आपका संकलित कोड चलाता है)। तो हाँ, आप इस जावा प्रोग्राम से बाहर निकल सकते हैं या इसे मार सकते हैं, अगर यह कुछ महत्वपूर्ण (सिस्टम) टूल नहीं है, लेकिन आपका अपना प्रोग्राम है; एक कार्य प्रबंधक की तरह एक नज़र है htop। हो सकता है कि आप एक वैध कार्यक्रम द्वारा उपयोग किए जाने वाले पोर्ट को बांधने का प्रयास करें जिसे मारना नहीं चाहिए।
xuiqzy

114

खिड़कियों में

netstat -ano

सभी प्रोटोकॉल, बंदरगाहों और प्रक्रियाओं को सुनने की सूची देगा। उपयोग

taskkill -pid "proces to kill" /f

पोर्ट को सुनने की प्रक्रिया को मारने के लिए। जैसे

 taskkill -pid 431 /f

10
netstat -ano | "अपने पोर्ट की संख्या ढूंढें" विशिष्ट पोर्ट के लिए विंडोज पर इसका उपयोग करें।
ब्लॉन्डकोड

मेरे लिए (विंडोज 10 का उपयोग करके) findकाम नहीं किया, लेकिन findstrकिया। झूठी सकारात्मकता से बचने के लिए यह एक बृहदान्त्र को आगे बढ़ाने में मदद करता है, जैसे netstat -ano | findstr :8080। ऐसा करने के बाद - मान लीजिए कि इसने 1234 का एक पीआईडी ​​लौटाया - यदि आप इस प्रक्रिया का नाम देखना चाहते हैं, तो यह किया जा सकता है tasklist /fi "pid eq 1234"
स्टीव चेम्बर्स

34

Mac में:

मार प्रक्रिया टर्मिनल:kill <pid>

पिड का पता लगाएं: टर्मिनल:lsof -i:<port>

डिएगो पिनो जवाब से


11
मार <pid> मैक पर काम नहीं किया, मार डालो -9 <PID> ने मेरे साथ काम किया
Samy Omar

33

में उबंटू / यूनिक्स हम जैसा कि नीचे वर्णित 2 चरणों में इस समस्या को हल कर सकते हैं।

  1. प्रकार netstat -plten |grep java

    इससे एक आउटपुट मिलेगा:

    tcp   0   0 0.0.0.0:8080   0.0.0.0:*  LISTEN   1001  76084  9488/java       

    यहाँ 8080पोर्ट नंबर है जिस पर जावा प्रक्रिया सुन रही है और 9488इसकी प्रक्रिया आईडी (pid) है।

  2. कब्जे वाले बंदरगाह को मुक्त करने के लिए, हमें killकमांड का उपयोग करके इस प्रक्रिया को मारना होगा ।

    kill -9 9488

    9488पहले से प्रक्रिया आईडी है। हम -9प्रक्रिया को रोकने के लिए बल प्रयोग करते हैं।

आपका पोर्ट अब फ्री होना चाहिए और आप सर्वर को रिस्टार्ट कर सकते हैं।


मैं डिजिटल सागर में सेंटो सर्वर को कॉन्फ़िगर कर रहा हूं। अगर मैं इस प्रक्रिया को मारता हूं तो मैं फिर से सर्वर कैसे चला सकता हूं?
अविजीत बरूआ

केवल -9 का उपयोग करें यदि यह आपका अपना कार्यक्रम है और आपके पास वहां खोने के लिए कोई डेटा नहीं है। यह स्पष्ट रूप से प्रक्रिया को मारता है, -15 प्रोग्राम को खुद से बाहर निकलने के लिए कहता है।
xuiqzy

27

(केवल विंडोज)

एक प्रक्रिया को मारने के लिए आपको पहले प्रोसेस आईडी (पीआईडी) ढूंढनी होगी

कमांड चलाकर:

netstat -ano | findstr :yourPortNumber

जैसा कि नीचे चित्र में दिखाया गया है

आपको अपना प्रोसेस आईडी (PID) मिलेगा, अब इसी प्रक्रिया को चलाने के लिए इस कमांड को मारें:

taskkill /pid yourid /f

यहां छवि विवरण दर्ज करें


7

आपके पास उसी पोर्ट पर चलने वाली एक और प्रक्रिया है।

आप अपने टास्क मैनेजर में चल रहे java.exe सेवाओं में से एक को मारने की कोशिश कर सकते हैं - ps सुनिश्चित करें कि आप ग्रहण को नहीं मारेंगे क्योंकि यह java.exe के रूप में भी सूचीबद्ध है। अगर कुछ और काम नहीं करता है, तो अपनी मशीन को फिर से शुरू करना किसी भी तरह इसे ठीक कर देगा। ऐसा लगता है कि आप पिछले परीक्षण से सॉकेट बंद नहीं कर रहे हैं। उम्मीद है की यह मदद करेगा।


6

उन लोगों के लिए जो उत्तर के सबसे सरल की तलाश कर रहे हैं (जैसा कि हम आमतौर पर याद करते हैं), बस अपनी चल रही परियोजना को रोक दें और इसे फिर से शुरू करें। अधिकांश समय हम जो करते हैं, हम उस परियोजना को रोकना भूल जाते हैं जिसे हम पहले चलाते थे और जब हम परियोजना को फिर से चलाते हैं तो ऐसा मुद्दा दिखाई देता है।

मैं इसे स्पष्ट करने के लिए एक फोटो भी संलग्न कर रहा हूं (मैं 'स्प्रिंग टूल सूट' का उपयोग करता हूं)। तो आपको जो करने की आवश्यकता है वह या तो अत्यधिक दाईं ओर दिए गए बटन पर क्लिक करें, यदि आप उसी परियोजना को फिर से शुरू करना चाहते हैं या पहले बटन पर क्लिक करें जो आपके प्रोजेक्ट को रोकने के लिए दाईं ओर से 2 है और फिर चरम बाईं ओर बटन को चलाने के लिए आपका प्रोजेक्ट। मुझे उम्मीद है कि यह कुछ नए प्रोग्रामर्स के मुद्दे को हल करेगा। :)

यहां छवि विवरण दर्ज करें


4

विंडोज सीएमडी लाइन में, निम्नलिखित आईडी दर्ज करके बाइंड पोर्ट पर एक कनेक्शन रखने वाली प्रोसेस आईडी का पता लगाएं:

C:> netstat -a -o

-सभी कनेक्शन दिखाएं

-शो प्रक्रिया पहचानकर्ता

और फिर प्रक्रिया को समाप्त करें।


2

हाँ, जैसा कि गुइडो सिमोन ने कहा था क्योंकि एक ही प्रक्रिया एक ही पोर्ट को सुनती है। यदि आप उबंटू में हैं तो आप बस उस प्रक्रिया को मार सकते हैं जो कमांड दे रही है sudo kill $(sudo lsof -t -i:[port number])

उदाहरण के लिए: sudo kill $(sudo lsof -t -i:8080)

लेकिन एक बार यह मेरे लिए काम नहीं किया। मैंने आज्ञा दी

$ lsof -i:[port] 

और यह कुछ नहीं दिखाता है।

मैंने कमांड के उपयोग docker ps -aसे अपने डॉकटर कंटेनरों की जाँच की, लेकिन उनमें से सभी जीवित हैं। सभी कंटेनर बंद हो गए हैं (लेकिन मुझे याद है, मैंने एक कंटेनर को रोका था जिसका इस्तेमाल कुछ मिनट पहले उसी पोर्ट पर किया गया था।) यह सुनिश्चित करने के लिए कि डॉक करने वाला कारण नहीं है, मैं पूरी तरह से रोक देता हूं। आदेश का उपयोग कर docker प्रक्रिया sudo service docker stopऔर पुन: प्रयास करें। उस समय आश्चर्यजनक रूप से ग्रहण ने त्रुटि नहीं दिखाई। यह मेरे कार्यक्रम को पूरी तरह से चलाता है।

आशा है कि मेरा अनुभव कुछ मदद करेगा।


2

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

fuser -k 8080/tcp

1

पोर्ट पहले से ही किसी अन्य प्रक्रिया द्वारा उपयोग किया जा रहा है जैसा कि @Diego Pino ने कहा कि यू यूनिक्स पर lsof का उपयोग इस प्रक्रिया का पता लगाने और संबंधित को मारने के लिए कर सकता है, यदि आप विंडोज़ पर हैं तो netstat -ano का उपयोग प्रक्रिया के सभी pids को प्राप्त करने के लिए और बंदरगाहों कि हर कोई प्राप्त करता है। अपने इच्छित बंदरगाह की खोज करें और मार डालें।

बहुत आसान हो बस अपनी मशीन को पुनरारंभ करें, यदि संभव हो तो :)


1

एक बार पीसी को रीस्टार्ट करें, मुझे लगता है कि यह काम करेगा। इसने मेरे मामले में काम करना शुरू कर दिया। एक और काम टास्क मैनेजर पर जा सकता है और प्रक्रिया को समाप्त कर सकता है।

संदर्भ के लिए स्क्रीनशॉट।


कृपया टिप्पणी / प्रश्न के साथ उत्तर न दें। इसे हटा दिया जाए तो बेहतर होगा।
क्लिजस्टर्स

1

मेरे मामले में टॉमकैट एक पृष्ठभूमि में चल रहा था। मैंने ग्रहण के दौरान इसे बाहरी सर्वलेट के रूप में स्थापित किया है। इंटेलीज में स्प्रिंग बूट के साथ इसका अपना सर्वर है, लेकिन यह पहले से ही कब्जे में होने के बावजूद शुरू नहीं हो सकता।
मेरे मामले में टॉमकैट स्वचालित रूप से शुरू होता है मैं अपने ओएस को चालू करता हूं, यही कारण है कि मुझे उसे मैनुअल बंद करने की आवश्यकता है:

$ sudo service tomcat stop

बेशक "टॉमकैट" यह निर्भर करता है कि आप किस संस्करण का उपयोग कर रहे हैं।
आशा है कि यह किसी की मदद कर सकता है।


0

मुझे ग्रहण में इसी तरह की समस्या का सामना करना पड़ा, जब मैंने पहले सर्वर प्रोग्राम शुरू किया और फिर क्लाइंट प्रोग्राम दो कंसोल खोले गए। मैं सिंगल कंसोल में प्रोग्राम को यह सोचकर बंद कर देता था कि उसने सर्वर को बंद कर दिया है, लेकिन उसने केवल क्लाइंट को बंद किया था और सर्वर को नहीं। मैंने अपने टास्क मैनेजर में जावा प्रक्रियाएँ चलाते हुए पाया। सर्वर और क्लाइंट प्रोग्राम को उनके व्यक्तिगत कंसोल से बंद करके इस समस्या को हल किया गया था (एक्लिप्स नवीनतम सक्रिय प्रोग्राम का कंसोल दिखाता है)। इसलिए जब मैंने फिर से सर्वर प्रोग्राम शुरू किया, तो पोर्ट फिर से कैप्चर होने के लिए खुला था।


0

आपका पोर्ट किसी अन्य प्रक्रिया में व्यस्त होना चाहिए। तो आप https://tchnet.microsoft.com/en-us/sysinternals/bb897437 पर TCPView डाउनलोड कर सकते हैं और उपयोग किए गए पोर्ट के लिए प्रक्रिया को मार सकते हैं ।

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


0

(1) जाँच करें कि पोर्ट उपयोग में है या नहीं, उस प्रक्रिया को मारें

$ lsof -i: [पोर्ट]

(2) एक अन्य कारण यह है कि बंदरगाह का उपयोग ipv6, समाधान द्वारा किया जाता है:

/etc/sysctl.conf संपादित करें

इसे फ़ाइल में जोड़ें

net.ipv6.conf.all.disable_ipv6 = 1

फिर इसे प्रभावी करें

$ sudo sysctl -p /etc/sysctl.conf

या सिर्फ रिबूट


0

इसका मतलब है कि कुछ अन्य प्रक्रिया पहले से ही पोर्ट का उपयोग कर रही है। यदि इस पोर्ट का उपयोग कुछ अन्य महत्वपूर्ण अनुप्रयोगों द्वारा किया जा रहा है और आप उस एप्लिकेशन को बंद नहीं करना चाहते हैं, तो बेहतर तरीका यह है कि आप किसी अन्य पोर्ट को चुनें जो उपयोग करने के लिए स्वतंत्र है।

किसी भी अन्य पोर्ट का उपयोग करने के लिए अपने एप्लिकेशन को कॉन्फ़िगर करें जो मुफ़्त है और आप अपने एप्लिकेशन को काम करते हुए देखेंगे।


0

खिड़कियों के लिए :

  1. प्रक्रिया आईडी खोजें

    netstat -nao | "8080" ढूंढें

यह आपको एक नंबर के रूप में प्रक्रिया आईडी दिखाएगा।

उदाहरण :

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       18856

यहां 18856 प्रोसेस आईडी है

  1. उस प्रक्रिया को मार डालो

    टास्ककिल / पीआईडी ​​18856 / एफ

आउटपुट : सफलता: पीआईडी ​​18856 के साथ प्रक्रिया समाप्त कर दी गई है।

यहां टास्ककिल का उपयोग करके आप प्रक्रिया आईडी को मार रहे हैं: 18856

लिनक्स / मैक के लिए :

sudo kill -9 $(sudo lsof -t -i:8080)

यहां आपको sudo lsof -t -i:8080sudo किल कमांड द्वारा इसे इस्तेमाल करने और मारने की प्रक्रिया मिल रही है

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