EADDRINUSE (errno 98)

errno 98

LINUX

الرسالة الرسمية (كما تظهر على الشاشة): Address already in use

يُبحث عنه أيضًا باسم: Address already in use, errno 98, listen EADDRINUSE, address already in use :::3000

طرفية Linux تشغّل strace مع إبراز استدعاء النظام الفاشل وقيمة errno
errno في Linux: تتبّع استدعاء النظام الفاشل بدقة قبل تغيير أي شيء.

ماذا يعني

تعني EADDRINUSE، أي 'Address already in use' (errno 98 في Linux و48 في macOS)، أن برنامجاً حاول الارتباط بعنوان IP ومنفذ يحتلهما مقبس (socket) آخر. يعرضها Node.js بصيغة 'listen EADDRINUSE: address already in use :::3000'. السبب المعتاد أن نسخة قديمة ما زالت تعمل.

ينطبق على: Linux, macOS (BSD errno), WSL, حاويات Docker

كيفية إصلاح EADDRINUSE (errno 98)

  1. اعثر على العملية التي تحتل المنفذ: 'sudo lsof -i :3000' أو 'sudo ss -ltnp | grep :3000' (في Windows: 'netstat -ano | findstr :3000')
  2. أوقف تلك العملية بلطف، أو بالأمر 'kill <pid>' إذا كانت خادم تطوير عالقاً
  3. افحص الخدمات المكررة: فقد تكون وحدة systemd أو حاوية Docker ('docker ps') أو عملية PM2 تشغّل التطبيق نفسه
  4. غيّر منفذ تطبيقك إذا كان لا بد من تشغيل الخدمتين معاً
  5. بعد إعادة التشغيل، فعّل SO_REUSEADDR على مقابس الخادم حتى لا تمنع الاتصالات في حالة TIME_WAIT إعادة الارتباط
  6. إذا حدث ذلك في الاختبارات، فاستخدم المنفذ 0 لكل خادم اختبار ليعيّن النظام منفذاً حراً

سبب حدوثه

لا يمكن عادةً لمقبس واحد فقط الارتباط بزوج عنوان/منفذ معين. وتسبب التعارض: خوادم تطوير يتيمة، ونسخة ثانية من الخدمة، وربط منافذ Docker، ومقابس في حالة TIME_WAIT دون SO_REUSEADDR.

الأسئلة الشائعة

كيف أنهي العملية على المنفذ 3000؟

شغّل 'lsof -i :3000' للحصول على PID ثم 'kill <PID>'. وفي Windows استخدم 'netstat -ano | findstr :3000' ثم 'taskkill /PID <PID> /F'.

لماذا يكون المنفذ قيد الاستخدام رغم أنه لا شيء يعمل؟

قد تكون نسخة سابقة ما زالت تُغلق أو محتجزة في TIME_WAIT، أو أن حاوية أو خدمة نظام مرتبطة به.

أخطاء ذات صلة

المصدر: Linux kernel errno.h · حلول كتبها المحررون وراجعوها (راجع السياسة التحريرية)

آخر تحديث: