यदि कोई लोकल डेवलपमेंट सर्वर यह बताता है कि कोई पोर्ट पहले से उपयोग में है, तो उस TCP पोर्ट पर सुन रही प्रोसेस को खोजने के लिए macOS के इन-बिल्ट lsof कमांड का उपयोग करें। टर्मिनल में, पोर्ट नंबर और लिसनिंग-स्टेट फ़िल्टर के साथ lsof चलाएं, फिर प्रोसेस को रोकने का निर्णय लेने से पहले उसकी जांच करने के लिए रिपोर्ट किए गए PID का उपयोग करें।
TCP पोर्ट पर सुन रही प्रोसेस को खोजें
टर्मिनल खोलें और 3000 को एरर मैसेज वाले पोर्ट नंबर से बदलें। कमांड को दिखाए गए अनुसार दर्ज करें; संख्या प्लेन टेक्स्ट है, इसलिए किसी शेल एस्केपिंग की आवश्यकता नहीं है।
lsof -nP -iTCP:3000 -sTCP:LISTEN
lsof इंटरनेट सॉकेट्स सहित प्रोसेस द्वारा खोली गई फ़ाइलों को सूचीबद्ध करता है। यहाँ, -iTCP:3000 उस पोर्ट के लिए TCP कनेक्शनों का चयन करता है, और -sTCP:LISTEN परिणामों को उन सॉकेट्स तक सीमित करता है जो कनेक्शन की प्रतीक्षा कर रहे हैं। -nP नामों को हल (resolve) करने के बजाय lsof को संख्यात्मक पते और पोर्ट नंबर प्रदर्शित करने का निर्देश देता है, जिससे परिणाम की तुलना आपके द्वारा खोजे गए पोर्ट से करना आसान हो जाता है। ये विकल्प Apple के ओपन-सोर्स macOS lsof मैनुअल में प्रलेखित हैं। Apple का macOS lsof मैनुअल
परिणाम इस तरह दिख सकता है; नाम और संख्याएं केवल उदाहरण के लिए हैं, किसी विशेष Mac की रिपोर्ट नहीं हैं:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 8421 sam 21u IPv6 ... 0t0 TCP *:3000 (LISTEN)
COMMAND को प्रोसेस नाम और PID को इसकी प्रोसेस ID के रूप में पढ़ें। NAME फ़ील्ड लोकल एड्रेस और पोर्ट दिखाता है। *:3000 एक वाइल्डकार्ड एड्रेस को दर्शाता है, जबकि localhost:3000 या कोई संख्यात्मक लूपबैक एड्रेस लूपबैक बाइंडिंग को दर्शाता है। एक वाइल्डकार्ड लिसनर कई लोकल इंटरफेस पर भेजे गए कनेक्शन स्वीकार कर सकता है; यह अपने आप यह स्थापित नहीं करता है कि सर्विस इंटरनेट से पहुंच योग्य है। लिसनिंग फ़िल्टर उपयोगी है क्योंकि किसी प्रोसेस में उसी पोर्ट से संबंधित सामान्य क्लाइंट कनेक्शन भी हो सकते हैं।
जांचें कि PID किससे संबंधित है
macOS की प्रोसेस सूची से अधिक विवरण प्राप्त करने के लिए आउटपुट से मिले PID का उपयोग करें। 8421 को अपने मिले हुए PID से बदलें:
ps -p 8421 -o pid=,ppid=,user=,command=
यह प्रोसेस ID, पैरेंट प्रोसेस ID, अकाउंट का नाम और कमांड लाइन प्रदर्शित करता है। कमांड लाइन यह पहचानने में मदद कर सकती है कि लिसनर किसी डेवलपमेंट सर्वर, रनटाइम या किसी अन्य एप्लिकेशन से संबंधित है या नहीं। lsof में एक संक्षिप्त COMMAND मान हमेशा उस प्रोजेक्ट या ऐप की पहचान करने के लिए पर्याप्त नहीं होता है जिसने इसे लॉन्च किया था, इसलिए अधिक विस्तृत ps आउटपुट की तुलना उस टर्मिनल टैब या एप्लिकेशन से करें जिसके तहत सर्वर होने की उम्मीद है।
यदि lsof कोई परिणाम नहीं दिखाता है, तो जांचें कि पोर्ट नंबर सही है और एप्लिकेशन अभी भी चल रहा है। हो सकता है कि सर्वर बंद हो गया हो, TCP के बजाय UDP का उपयोग कर रहा हो, या उसने अभी तक अपना लिसनिंग सॉकेट न खोला हो। उस पोर्ट पर UDP सॉकेट्स की जांच करने के लिए, चलाएं:
lsof -nP -iUDP:3000
UDP, TCP की LISTEN स्थिति का उपयोग नहीं करता है, इसलिए इस क्वेरी में -sTCP:LISTEN न जोड़ें। यदि कोई परिणाम दिखाई देता है, तो इसके COMMAND और PID को सुराग के रूप में उपयोग करें, फिर ऊपर बताए अनुसार ps के साथ उस PID की जांच करें।
यदि कमांड कोई परिणाम नहीं दिखाता है या अनुमति त्रुटि (permission error) देता है
किसी अन्य अकाउंट के तहत चल रही प्रोसेस आपके वर्तमान उपयोगकर्ता को दिखाई नहीं दे सकती है। यदि आपको अनुमति से संबंधित कोई संदेश मिलता है या संदेह है कि सॉकेट किसी अन्य उपयोगकर्ता का है, तो एडमिनिस्ट्रेटर विशेषाधिकारों के साथ TCP क्वेरी फिर से चलाएं:
sudo lsof -nP -iTCP:3000 -sTCP:LISTEN
टर्मिनल आपके Mac अकाउंट का पासवर्ड मांगेगा। जब आप इसे टाइप करेंगे, तो आमतौर पर अक्षर दिखाई नहीं देते हैं; पूरा होने पर Return दबाएं। परिणाम का निरीक्षण करने के लिए एडमिनिस्ट्रेटर एक्सेस का उपयोग करें, फिर कोई कार्रवाई करने से पहले संबंधित ऐप की पहचान करें। यदि कमांड अभी भी कुछ नहीं दिखाता है, तो पोर्ट विवाद (port conflict) के दौरान पुनः प्रयास करें: त्रुटि और खोज के बीच प्रोसेस की स्थिति बदल सकती है।
सही एप्लिकेशन को बंद करें
PID खोजने से किसी प्रोसेस की पहचान होती है; यह आपको यह नहीं बताता कि इसे समाप्त करना सुरक्षित है या नहीं। यदि आप इसके ओनर को पहचानते हैं, तो उस एप्लिकेशन या टर्मिनल सेशन का उपयोग करके सर्वर को बंद करें जिसने इसे शुरू किया था, फिर अपने मूल कमांड को पुनः आज़माएं। इससे ऐप को सामान्य रूप से बंद होने का अवसर मिलता है। यदि आप यह नहीं बता सकते कि प्रोसेस को किसने लॉन्च किया था, तो किसी अपरिचित सिस्टम या बैकग्राउंड प्रोसेस को समाप्त करने के बजाय पहले कमांड लाइन या पैरेंट PID की जांच करें। lsof वर्तमान सॉकेट स्वामित्व की रिपोर्ट करता है; यह यह नहीं समझाता कि कोई ऐप क्यों शुरू हुआ या किस प्रोजेक्ट कॉन्फ़िगरेशन ने उस पोर्ट का चयन किया।
आपके इंस्टॉल किए गए macOS संस्करण पर कमांड विवरण के लिए, टर्मिनल man lsof के साथ अपना स्थानीय मैनुअल प्रदर्शित कर सकता है; बाहर निकलने के लिए q दबाएं। Apple की टर्मिनल गाइड कमांड दस्तावेज़ देखने के लिए man के उपयोग का वर्णन करती है। Mac पर Terminal का इस्तेमाल शुरू करें
स्रोत
macOS lsof मैनुअल पेज — Apple ओपन सोर्स
Mac पर Terminal का इस्तेमाल शुरू करें — Apple सपोर्ट