إذا أظهر خادم تطوير محلي أن منفذاً قيد الاستخدام بالفعل، فاستخدم أمر lsof المدمج في macOS للعثور على العملية التي تستمع على منفذ TCP هذا. في تطبيق Terminal، شغّل lsof مع رقم المنفذ وعامل تصفية لحالة الاستماع، ثم استخدم معرف العملية (PID) الناتج لفحص العملية قبل اتخاذ قرار بإيقافها.
العثور على العملية التي تستمع على منفذ TCP
افتح تطبيق Terminal واستبدل 3000 بالمنفذ المذكور في رسالة الخطأ. أدخل الأمر كما هو موضح؛ فالرقم نص عادي، لذا لا يلزم استخدام رموز تخطي سطر الأوامر (shell escaping).
lsof -nP -iTCP:3000 -sTCP:LISTEN
يعرض lsof الملفات المفتوحة بواسطة العمليات، بما في ذلك مقابس الإنترنت (Internet sockets). هنا، يحدد الخيار -iTCP:3000 اتصالات TCP لهذا المنفذ، بينما يضيق الخيار -sTCP:LISTEN النتائج لتقتصر على المقابس التي تنتظر اتصالات. ويطلب الخيار -nP من lsof عرض العناوين الرقمية وأرقام المنافذ بدلاً من محاولة حل أسمائها، مما يسهل مقارنة النتيجة بالمنفذ الذي بحثت عنه. هذه الخيارات موثقة في دليل lsof مفتوح المصدر الخاص بنظام macOS من Apple. دليل lsof لنظام macOS من Apple
قد تبدو النتيجة كما يلي؛ الأسماء والأرقام للتوضيح فقط، وليست تقريراً من جهاز Mac محدد:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 8421 sam 21u IPv6 ... 0t0 TCP *:3000 (LISTEN)
يمثل COMMAND اسم العملية وPID هو معرف العملية الخاص بها. يُظهر حقل NAME العنوان المحلي والمنفذ. تشير القيمة *:3000 إلى عنوان شامل (wildcard address)، بينما تشير localhost:3000 أو عنوان الاسترجاع الرقمي (loopback) إلى ربط داخلي (loopback binding). يمكن للمستمع ذي العنوان الشامل قبول الاتصالات الموجهة إلى واجهات محلية متعددة؛ وهذا لا يعني بحد ذاته إمكانية الوصول إلى الخدمة عبر الإنترنت. وتعد تصفية حالة الاستماع مفيدة لأن العملية قد تتضمن أيضاً اتصالات عميل عادية تستخدم نفس هذا المنفذ.
التحقق من تبعية معرف العملية (PID)
استخدم معرف العملية (PID) من النتيجة لطلب مزيد من التفاصيل من قائمة عمليات macOS. استبدل 8421 بمعرف العملية الذي عثرت عليه:
ps -p 8421 -o pid=,ppid=,user=,command=
يعرض هذا الأمر معرف العملية (PID)، ومعرف العملية الأصل (PPID)، واسم الحساب، وسطر الأوامر. يمكن لسطر الأوامر أن يساعد في تحديد ما إذا كان المستمع ينتمي إلى خادم تطوير، أو بيئة تشغيل، أو تطبيق آخر. إن القيمة القصيرة لـ COMMAND في lsof ليست كافية دائماً للتعرف على المشروع أو التطبيق الذي أطلقها، لذا قارن الناتج الأكثر تفصيلاً لأمر ps بتبويب Terminal أو التطبيق الذي تتوقع أن يكون الخادم تابعاً له.
إذا لم يُرجع lsof أي صفوف، فتأكد من صحة رقم المنفذ ومن أن التطبيق لا يزال قيد التشغيل. ربما تم إنهاء الخادم، أو قد يكون مستخدماً لبروتوكول UDP بدلاً من TCP، أو لم يفتح مقبس الاستماع الخاص به بعد. لفحص مقابس UDP على هذا المنفذ، شغّل:
lsof -nP -iUDP:3000
لا يستخدم بروتوكول UDP حالة LISTEN الخاصة بـ TCP، لذا لا تضف -sTCP:LISTEN إلى هذا الاستعلام. إذا ظهرت نتيجة، فاستخدم COMMAND وPID كإشارات استدلالية، ثم افحص معرف العملية (PID) هذا باستخدام ps كما هو موضح أعلاه.
إذا لم يُظهر الأمر أي نتيجة أو أظهر خطأ في الأذونات
قد لا تكون العملية التي تعمل تحت حساب آخر مرئية للمستخدم الحالي. إذا تلقيت رسالة متعلقة بالأذونات أو كنت تشك في أن مستخدماً آخر يملك المقبس، فأعد تشغيل استعلام TCP بامتيازات المسؤول:
sudo lsof -nP -iTCP:3000 -sTCP:LISTEN
سيطلب تطبيق Terminal كلمة مرور حساب Mac الخاص بك. عند كتابتها، لا تظهر الأحرف عادةً على الشاشة؛ اضغط على Return عند الانتهاء. استخدم وصول المسؤول لفحص النتيجة، ثم حدد التطبيق المالك قبل اتخاذ أي إجراء. إذا استمر الأمر في عدم إظهار أي شيء، فأعد المحاولة أثناء حدوث تعارض المنفذ: فقد تتغير حالة العملية بين لحظة حدوث الخطأ ولحظة البحث عنها.
إيقاف التطبيق الصحيح
إن العثور على معرف العملية (PID) يحدد ماهية العملية؛ لكنه لا يخبرك ما إذا كان إيقافها آمناً. إذا تعرفت على المالك، فأوقف الخادم باستخدام التطبيق أو جلسة Terminal التي بدأته، ثم أعد محاولة تنفيذ أمرك الأصلي. يتيح ذلك للتطبيق فرصة للإغلاق بشكل طبيعي. إذا لم تتمكن من معرفة ما أطلق العملية، فافحص سطر الأوامر أو معرف العملية الأصل (parent PID) أولاً بدلاً من إنهاء عملية نظام أو عملية خلفية غير مألوفة. يوضح أمر lsof ملكية المقبس الحالية فقط؛ ولا يشرح سبب بدء التطبيق أو أي تكوين للمشروع قد اختار ذلك المنفذ.
للحصول على تفاصيل الأوامر الخاصة بإصدار macOS المثبت لديك، يمكن لـ Terminal عرض دليله المحلي باستخدام man lsof؛ اضغط على q للخروج. يوضح دليل Terminal من Apple كيفية استخدام man للبحث في وثائق الأوامر. بدء استخدام تطبيق Terminal على Mac
المصادر
صفحة دليل lsof لنظام macOS — Apple Open Source
بدء استخدام تطبيق Terminal على Mac — دعم Apple