आप यहाँ गलत प्रश्न पूछ रहे हैं। यह संभव नहीं है कि केवल उस एप्लिकेशन के बाहर से "पोर्ट को बंद करें" जो उस पर सुनने वाला सॉकेट खोले। ऐसा करने का एकमात्र तरीका बंदरगाह के स्वामित्व वाली प्रक्रिया को पूरी तरह से मारना है। फिर, लगभग एक या दो मिनट में, पोर्ट फिर से उपयोग के लिए उपलब्ध हो जाएगा। यहाँ क्या हो रहा है (यदि आप परवाह नहीं करते हैं, तो अंत में छोड़ें जहां मैं आपको दिखाता हूं कि किसी विशेष पोर्ट के मालिक होने की प्रक्रिया को कैसे मारें):
पोर्ट विभिन्न प्रक्रियाओं के लिए ओएस द्वारा आवंटित संसाधन हैं। यह ओएस को फाइल पॉइंटर के लिए पूछने के समान है। हालाँकि, फ़ाइल पॉइंटर्स के विपरीत, एक समय में केवल एक प्रक्रिया ही पोर्ट का मालिक हो सकती है। बीएसडी सॉकेट इंटरफ़ेस के माध्यम से, प्रक्रियाएं पोर्ट पर सुनने के लिए अनुरोध कर सकती हैं, जिसे ओएस तब अनुदान देगा। OS यह भी सुनिश्चित करेगा कि किसी अन्य प्रक्रिया को समान पोर्ट न मिले। किसी भी बिंदु पर, प्रक्रिया सॉकेट को बंद करके पोर्ट को जारी कर सकती है। OS फिर पोर्ट को रिकॉल करेगा। वैकल्पिक रूप से, यदि पोर्ट को जारी किए बिना प्रक्रिया समाप्त हो जाती है, तो ओएस अंततः पोर्ट को फिर से प्राप्त करेगा (हालांकि यह तुरंत नहीं होगा: इसमें कुछ मिनट लगेंगे)।
अब, आप क्या करना चाहते हैं (केवल कमांड-लाइन से पोर्ट बंद करें), दो कारणों से संभव नहीं है। सबसे पहले, यदि यह संभव था, तो इसका मतलब होगा कि एक प्रक्रिया किसी अन्य प्रक्रिया के संसाधन (बंदरगाह) को चुरा सकती है। यह खराब नीति होगी, जब तक कि विशेषाधिकार प्राप्त प्रक्रियाओं तक सीमित न हो। दूसरा कारण यह स्पष्ट नहीं है कि पोर्ट के स्वामित्व वाली प्रक्रिया का क्या होगा यदि हम इसे चालू रखने दें। प्रक्रिया का कोड यह मानते हुए लिखा गया है कि यह इस संसाधन का मालिक है। यदि हम इसे दूर ले जाते हैं, तो यह स्वयं ही दुर्घटनाग्रस्त हो जाएगा, इसलिए OS आपको ऐसा नहीं करने देगा, भले ही आप एक शानदार प्रक्रिया हो। इसके बजाय, आपको बस उन्हें मारना चाहिए।
वैसे भी, यहाँ उस प्रक्रिया को कैसे मारना है जो एक विशेष बंदरगाह का मालिक है:
sudo netstat -ap | grep :<port_number>
उदाहरण के लिए, पोर्ट होल्डिंग प्रक्रिया के अनुरूप लाइन आउटपुट करेगी:
tcp 0 0 *:8000 *:* LISTEN 4683/procHoldingPort
इस मामले में, procHoldingPort उस प्रक्रिया का नाम है जिसने पोर्ट को खोला, 4683 इसका pid है, और 8000 (ध्यान दें कि यह TCP है) यह पोर्ट नंबर है।
फिर, अंतिम कॉलम में देखें, आप देखेंगे /। फिर इस पर अमल करें:
kill <pid>
यदि वह काम नहीं करता है (आप netstat कमांड को फिर से चलाकर देख सकते हैं)। यह करो:
kill -9 <pid>
सामान्य तौर पर, यदि आप कर सकते हैं तो SIGKILL भेजने से बचना बेहतर है। यही कारण है कि मैं आपको kill
पहले प्रयास करने के लिए कहता हूं kill -9
। सिर्फ kill
जेंटलर SIGTERM भेजता है।
जैसा कि मैंने कहा, पोर्ट को फिर से खोलने में कुछ मिनट लगेंगे यदि आप ऐसा करते हैं। मैं इसे गति देने का कोई तरीका नहीं जानता। अगर कोई और करता है, तो मुझे यह सुनना अच्छा लगेगा।