208 من 208 رمز
يتطلب الإجراء امتيازات لا تملكها العملية، مثل تغيير مالك ملف أو إرسال إشارة إلى عملية تخص مستخدمًا آخر أو تعديل ملف غير قابل للتغيير (chattr +i). بخلاف EACCES، لا يُحل بتغيير أذونات الملف: يلزم root أو الـ capability المناسبة.
الملف أو المجلد غير موجود. ويظهر أيضًا عندما يكون أحد المجلدات الوسيطة في المسار مفقودًا، أو عندما يشير رابط رمزي إلى هدف غير موجود، أو عندما لا يكون المفسر المذكور في سطر #! في السكربت مثبتًا.
لا توجد أي عملية أو مجموعة عمليات أو خيط بهذا المعرّف؛ مثلًا عند تنفيذ kill على PID انتهت عمليته بالفعل.
قاطعت إشارةٌ استدعاء النظام قبل أن يكتمل. ليس خطأً حقيقيًا: يجب على البرنامج إعادة محاولة الاستدعاء، أو تثبيت معالج الإشارة مع SA_RESTART.
خطأ إدخال/إخراج منخفض المستوى، عادةً عند القراءة من الجهاز أو الكتابة إليه. في الأقراص يدل غالبًا على قطاعات تالفة أو كابل معطوب: راجع dmesg وحالة SMART. ويظهر أيضًا عند الكتابة إلى طرفية أُغلقت بالفعل.
الجهاز أو العنوان غير موجود: ملف الجهاز موجود لكن لا يوجد عتاد خلفه، أو فُتح FIFO للكتابة مع O_NONBLOCK دون أي قارئ.
قائمة الوسائط ومتغيرات البيئة الممررة إلى exec كبيرة جدًا. إنه الخطأ الشهير «Argument list too long» عند استخدام حرف بدل يتوسع إلى آلاف الملفات؛ استخدم find -exec أو xargs.
ليس للملف تنسيق تنفيذي معروف: إما أنه ملف ثنائي لمعمارية أخرى، أو تالف، أو سكربت بلا سطر #!.
واصف الملف غير صالح، أو أُغلق بالفعل، أو فُتح بوضع لا يسمح بالإجراء، مثل الكتابة في واصف مفتوح للقراءة فقط.
ليس للعملية أبناء تنتظرهم عبر wait أو waitpid، وغالبًا لأن SIGCHLD مُتجاهَلة فيُجمع الأبناء تلقائيًا.
المورد غير متاح حاليًا ويُستحسن إعادة المحاولة. في الإجراءات غير الحاجبة يعني أنه لا توجد بيانات أو مساحة بعد؛ وفي fork يعني أنه تم بلوغ حد العمليات أو الخيوط (ulimit -u أو pids.max في الـ cgroup).
القيمة نفسها:EWOULDBLOCK
لا توجد ذاكرة كافية للإجراء أو تم تجاوز أحد حدود ذاكرة العملية. في fork أو mmap قد يرجع ذلك إلى سياسة الـ overcommit أو حد الـ cgroup أو نقص مساحة العناوين.
رُفض الإذن بسبب أذونات الملف أو أحد مجلدات المسار (يلزم إذن التنفيذ في كل منها)، أو بسبب ACL، أو SELinux أو AppArmor، أو بسبب تركيب بالخيار noexec. وتعيده bind أيضًا عند استخدام منفذ أقل من 1024 دون امتيازات.
مُرِّر إلى استدعاء نظام مؤشرٌ إلى عنوان ذاكرة غير صالح. يدل على خلل (bug) في البرنامج.
يحتاج الإجراء إلى جهاز كتلي، مثل قرص، لكنه تلقى نوعًا آخر من الملفات؛ مثلًا عند تركيب ملف عادي دون -o loop.
الجهاز أو المورد قيد الاستخدام. يحدث عادةً عند إلغاء تركيب نظام ملفات فيه ملفات مفتوحة أو طرفية موجودة داخله؛ يُظهر lsof أو fuser العمليات التي تستخدمه.
يوجد بالفعل ملف أو مجلد أو كائن آخر بهذا الاسم، مثلًا عند الإنشاء مع O_EXCL، أو استخدام mkdir دون -p، أو إنشاء رابط وجهته موجودة بالفعل.
لا يمكن إنشاء رابط صلب ولا إعادة تسمية ملف بين نظامي ملفات مختلفين. يحل mv ذلك بالنسخ ثم الحذف؛ وعلى البرامج التي تستخدم rename() أن تفعل الشيء نفسه.
الجهاز غير موجود أو لا يدعم الإجراء؛ مثلًا عند تركيب نوع نظام ملفات لم تُحمَّل وحدة النواة الخاصة به.
أحد مكونات المسار الذي يُفترض أن يكون مجلدًا هو ملف، أو طُلب مجلد (O_DIRECTORY) وهو ليس كذلك.
جرت محاولة تنفيذ إجراء خاص بالملفات على مجلد، مثل فتحه للكتابة.
إحدى الوسائط غير صالحة للاستدعاء: قيمة خارج النطاق، أو مجموعة خيارات غير متوافقة، أو إجراء لا يدعمه الكائن. إنه خطأ عام: صفحة man الخاصة بالاستدعاء تسرد الحالات المحددة.
امتلأ جدول الملفات المفتوحة على مستوى النظام بأكمله. يُضبط الحد عبر fs.file-max في sysctl.
بلغت العملية حدها من الواصفات المفتوحة («Too many open files»). ارفع الحد باستخدام ulimit -n أو LimitNOFILE في systemd، وتحقق من أن البرنامج لا يترك ملفات أو مقابس (sockets) دون إغلاق.
طُلب إجراء خاص بالطرفية (ioctl) على شيء ليس طرفية، مثلًا عند إعادة توجيه مخرجات برنامج تفاعلي إلى ملف أو إلى pipe.
الملف التنفيذي قيد الاستخدام: لا يمكن الكتابة في ملف ثنائي أثناء تشغيله، ولا تشغيل ملف ما زال مفتوحًا للكتابة. لتحديثه، يُفضَّل كتابة ملف جديد ثم إعادة تسميته.
يتجاوز الملف الحجم الأقصى الذي يدعمه نظام الملفات (4 GB في FAT32) أو حد RLIMIT_FSIZE للعملية.
لم تبقَ مساحة على الجهاز. إذا أظهر df مساحة حرة، فتحقق من الـ inodes باستخدام df -i. وتعيده inotify أيضًا عند استنفاد fs.inotify.max_user_watches.
لا يمكن تنفيذ lseek على pipe أو FIFO أو socket، لأنها لا تملك موضعًا.
نظام الملفات مركّب للقراءة فقط. إذا تحول إلى القراءة فقط دون أن يطلب أحد ذلك، فالنواة هي التي فعلت ذلك عند اكتشاف أخطاء: راجع dmesg وشغّل fsck.
تم تجاوز الحد الأقصى لعدد الروابط الصلبة لملف، أو لعدد المجلدات الفرعية في مجلد في بعض أنظمة الملفات.
جرت الكتابة في pipe أو socket أُغلق طرفه الآخر بالفعل («Broken pipe»). إضافة إلى الخطأ، تتلقى العملية SIGPIPE؛ وهذا طبيعي عندما ينتهي القارئ أولًا، كما في cmd | head.
وسيطة دالة رياضية خارج مجالها، مثل الجذر التربيعي لعدد سالب.
نتيجة الدالة أكبر أو أصغر من أن تُمثَّل، أو المخزن المؤقت لا يتسع للنتيجة، كما في getcwd مع مخزن مؤقت قصير.
تم تجنب جمود (deadlock): القفل المطلوب، مثل قفل ملف عبر fcntl أو mutex مع كشف الأخطاء، كان سيبقى في الانتظار إلى الأبد.
القيمة نفسها:EDEADLOCK
يتجاوز المسار أو أحد مكوناته الطول الأقصى: في Linux عمومًا 255 بايت للاسم و4096 للمسار.
لا تتوفر أقفال. في NFS يدل غالبًا على أن خدمة القفل (lockd أو rpc.statd) لا تعمل.
استدعاء النظام غير موجود في هذه النواة أو غير مُنفَّذ. يحدث عادةً مع ملفات ثنائية مُصرَّفة لنواة أحدث، أو مع ملفات تعريف seccomp في الحاويات التي لا تعرف الاستدعاءات الحديثة.
المجلد ليس فارغًا، مثلًا عند استخدام rmdir أو عند إعادة التسمية فوق مجلد موجود. لحذفه مع محتواه، استخدم rm -r.
توجد روابط رمزية متسلسلة كثيرة جدًا عند حل المسار، عادةً بسبب حلقة، أو استُخدم O_NOFOLLOW على رابط رمزي.
لا توجد أي رسالة من النوع المطلوب في طابور رسائل System V.
حُذف معرّف IPC الخاص بـ System V (طابور أو سيمافور أو ذاكرة مشتركة) أثناء استخدام العملية له.
رقم القناة خارج النطاق. رمز موروث بلا استخدام عملي في Linux.
المستوى 2 غير متزامن. رمز موروث من System V بلا استخدام عملي في Linux.
المستوى 3 متوقف. رمز موروث من System V بلا استخدام عملي في Linux.
أُعيد تعيين المستوى 3. رمز موروث من System V بلا استخدام عملي في Linux.
رقم الرابط خارج النطاق. رمز موروث بلا استخدام عملي في Linux.
برنامج تشغيل البروتوكول غير متصل. تستخدمه أنظمة فرعية قليلة، مثل بعض برامج تشغيل Bluetooth.
لا تتوفر أي بنية CSI. رمز موروث بلا استخدام عملي في Linux.
المستوى 2 متوقف. رمز موروث من System V بلا استخدام عملي في Linux.
تبادل غير صالح. رمز موروث تعيد بعض برامج التشغيل وأنظمة الملفات استخدامه بمعنى خاص بها.
واصف طلب غير صالح. رمز موروث تعيد بعض برامج التشغيل استخدامه بمعنى خاص بها.
التبادل ممتلئ. رمز موروث بلا استخدام عملي في Linux.
لا يوجد أي «anode». رمز موروث بلا استخدام عملي في Linux.
رمز طلب غير صالح. رمز موروث؛ تستخدمه بعض برامج التشغيل للأوامر التي لا تدعمها.
فتحة (slot) غير صالحة. رمز موروث بلا استخدام عملي في Linux.
تنسيق ملف الخط غير صحيح. رمز موروث بلا استخدام عملي في Linux.
الجهاز ليس STREAM. ينتمي إلى واجهة STREAMS في System V، التي لا يطبقها Linux.
لا توجد بيانات متاحة. في Linux تعيده getxattr عندما لا تكون السمة الموسعة موجودة؛ وفي macOS تقابل هذه الحالة ENOATTR.
انتهى مؤقِّت. مصدره STREAMS؛ وفي Linux تستخدمه بعض برامج التشغيل وio_uring للعمليات ذات المهلة الزمنية.
نفدت موارد STREAMS، وهي واجهة لا يطبقها Linux.
الحاسوب ليس على الشبكة. رمز موروث قليل الاستخدام.
الحزمة غير مثبتة. رمز موروث؛ تستخدمه بعض الأنظمة الفرعية عند غياب وحدة، مثل وحدة تشفير.
الكائن بعيد. في NFS يشير إلى مسار يُصدَّر من خادم آخر.
انقطع الرابط. رمز موروث؛ تستخدمه بعض برامج التشغيل عند فقدان الاتصال بالجهاز.
خطأ «advertise». رمز موروث من RFS بلا استخدام في Linux.
خطأ «srmount». رمز موروث من RFS بلا استخدام في Linux.
خطأ اتصال أثناء الإرسال. رمز موروث؛ تستخدمه بعض برامج تشغيل الشبكة وUSB.
خطأ في البروتوكول: أجاب الطرف الآخر أو الجهاز بشيء غير متوقع. يظهر مع أجهزة USB وفي الاتصالات التي تنقطع في منتصف تبادل.
جرت محاولة قفزة متعددة (multihop). رمز موروث من RFS.
خطأ خاص بـ RFS. بلا استخدام في Linux.
الرسالة مشوهة أو تالفة. تعيده ext4 وXFS وBtrfs، بالاسم البديل EFSBADCRC، عندما يفشل المجموع الاختباري للبيانات الوصفية.
القيمة نفسها:EFSBADCRC
القيمة لا تتسع في نوع البيانات الهدف؛ مثلًا برنامج 32 بت مُصرَّف دون دعم الملفات الكبيرة يفتح ملفًا أكبر من 2 GB.
الاسم ليس فريدًا على الشبكة. رمز موروث.
واصف الملف في حالة غير صحيحة. تستخدمه ALSA وبعض برامج التشغيل عندما لا يكون الجهاز جاهزًا.
تغيّر العنوان البعيد. رمز موروث.
لا يمكن الوصول إلى مكتبة مشتركة مطلوبة. رمز موروث من ملفات a.out الثنائية.
المكتبة المشتركة تالفة. رمز موروث من ملفات a.out الثنائية.
القسم .lib في ملف a.out الثنائي تالف. رمز موروث.
جرت محاولة ربط عدد كبير جدًا من المكتبات المشتركة. رمز موروث من a.out.
لا يمكن تنفيذ مكتبة مشتركة مباشرة. رمز موروث من a.out.
تسلسل البايتات غير صالح لترميز الأحرف، مثل نص ليس UTF-8 صالحًا عند تحويله باستخدام iconv أو بالدوال متعددة البايتات.
يجب إعادة تشغيل الاستدعاء المقاطَع. للاستخدام الداخلي في النواة ولا ينبغي أن يصل إلى البرامج.
خطأ pipe في STREAMS. تعيده ALSA عندما يكون جهاز الصوت معلّقًا.
يوجد عدد كبير جدًا من المستخدمين. يعيده نظام حصص القرص عندما يمتلئ جدوله، وهو غير شائع.
استُخدم إجراء socket على واصف ليس socket.
عنوان الوجهة مفقود: جرى الإرسال عبر socket غير متصل دون تحديد الوجهة.
الرسالة كبيرة جدًا بالنسبة إلى الـ socket، مثل حزمة بيانات UDP أكبر من الحد الأقصى أو من الـ MTU عندما لا يُسمح بالتجزئة.
البروتوكول لا يتوافق مع نوع الـ socket.
خيار الـ socket أو البروتوكول المطلوب غير متاح، مثل خيار في setsockopt لا تعرفه النواة.
البروتوكول غير مدعوم، مثلًا لأن وحدة النواة الخاصة به غير محمّلة.
نوع الـ socket غير مدعوم في عائلة العناوين هذه.
الإجراء غير مدعوم من الـ socket أو من الكائن. في Linux له القيمة نفسها التي لـ ENOTSUP، وتعيده أنظمة ملفات كثيرة للوظائف التي لا تطبقها، مثل fallocate أو السمات الموسعة.
الإجراء غير مدعوم. في Linux له القيمة نفسها التي لـ EOPNOTSUPP (95)؛ أما في macOS فهما رمزان مختلفان.
عائلة البروتوكولات غير مدعومة.
عائلة العناوين غير مدعومة؛ يحدث عادةً عند استخدام IPv6 في نظام أو حاوية عُطِّل فيها.
العنوان والمنفذ قيد الاستخدام بالفعل: عملية أخرى تستمع على هذا المنفذ، أو ما زال الاتصال السابق في حالة TIME_WAIT. ابحث عن العملية باستخدام ss -ltnp أو lsof -i :المنفذ، أو استخدم SO_REUSEADDR.
لا يمكن تعيين العنوان المطلوب: عنوان IP لا ينتمي إلى أي واجهة في الجهاز، أو نفدت المنافذ المؤقتة للاتصالات الصادرة.
واجهة الشبكة معطلة.
لا يمكن الوصول إلى شبكة الوجهة لعدم وجود أي مسار إليها. راجع جدول التوجيه والبوابة؛ ويحدث أيضًا عند الاتصال عبر IPv6 دون اتصال IPv6.
أعادت الشبكة تعيين الاتصال، مثلًا عند فشل keepalive.
أُجهض الاتصال من الجانب المحلي، مثلًا لأن العميل أغلقه قبل أن يقبله الخادم عبر accept.
قطع الطرف الآخر الاتصال فجأة بحزمة RST («Connection reset by peer»): أُغلقت العملية البعيدة، أو قطع جدار حماية أو موازن أحمال الاتصال الخامل، أو أُرسلت بيانات لم يكن الطرف الآخر يتوقعها.
لا توجد مساحة مخزن مؤقت متاحة في النواة لعملية الشبكة؛ يظهر عادةً مع حركة مرور كثيفة أو امتلاء طوابير الـ sockets.
الـ socket متصل بالفعل.
الـ socket غير متصل: جرت محاولة الإرسال أو الاستقبال قبل الاتصال، أو أُغلق الاتصال بالفعل. في تركيب FUSE يظهر بالصيغة «Transport endpoint is not connected» عندما تموت عمليته؛ ويُصلح بإلغاء التركيب باستخدام fusermount -u.
لا يمكن الإرسال بعد إغلاق هذا الاتجاه من الـ socket باستخدام shutdown.
توجد مراجع كثيرة جدًا؛ في Linux، عند تمرير عدد كبير جدًا من الواصفات المتداخلة عبر socket من نوع Unix.
انتهت مهلة الاتصال لأن الوجهة لم تستجب. يرجع ذلك عادةً إلى جدار حماية يُسقط الحزم بصمت، أو مضيف مطفأ، أو مسار لا يصل.
رفضت الوجهة الاتصال: الجهاز يستجيب، لكن لا أحد يستمع على ذلك المنفذ أو يرد جدار حماية بالرفض. تحقق من أن الخدمة تعمل وتستمع على الواجهة الصحيحة، وليس على 127.0.0.1 فقط.
المضيف الوجهة معطل.
لا يوجد مسار إلى المضيف: لا يستجيب لـ ARP في الشبكة المحلية، أو يبلّغ موجّه أو جدار حماية بأنه غير قابل للوصول.
هناك إجراء جارٍ بالفعل على الـ socket، مثل connect غير حاجب لم ينتهِ بعد.
الإجراء قيد التنفيذ: بدأ connect غير حاجب وسينتهي لاحقًا. ليس خطأً؛ يجب الانتظار باستخدام poll أو select.
أصبح معرّف الملف قديمًا: في NFS، حُذف الملف أو المجلد أو استُبدل على الخادم. يُحل بإعادة فتح المسار أو إعادة التركيب.
البنية تحتاج إلى تنظيف: اكتشف نظام الملفات تلفًا (في ext4 وXFS، بالاسم البديل EFSCORRUPTED). ألغِ تركيبه وشغّل fsck أو xfs_repair.
القيمة نفسها:EFSCORRUPTED
ليس ملفًا مُسمّى من XENIX. رمز موروث بلا استخدام.
لا تتوفر سيمافورات XENIX. رمز موروث بلا استخدام.
إنه ملف مُسمّى من XENIX. رمز موروث بلا استخدام.
خطأ إدخال/إخراج بعيد، مثلًا من جهاز I2C أو من قرص بعيد لم يستجب.
تم تجاوز حصة القرص للمستخدم أو المجموعة.
لا يوجد أي وسيط في الجهاز، مثل محرك أقراص بلا قرص أو قارئ بطاقات فارغ.
نوع الوسيط غير صحيح.
أُلغي الإجراء، مثل إدخال/إخراج غير متزامن أو انتظار في io_uring.
المفتاح المطلوب غير موجود في keyring النواة. يظهر مع أنظمة الملفات المشفرة، مثل fscrypt أو eCryptfs، عندما لا يكون المفتاح محمّلًا.
انتهت صلاحية المفتاح. ويستخدمه PAM وKerberos أيضًا عند انتهاء صلاحية كلمة المرور أو التذكرة.
أُبطل المفتاح.
رفضت الخدمة المفتاح.
مات مالك mutex متين (robust) دون تحريره. يجب على المالك الجديد إعادة الحالة المحمية إلى الاتساق واستدعاء pthread_mutex_consistent.
لا يمكن استعادة الحالة المحمية بـ mutex متين، لأن المالك السابق مات ولم يعلّمها أحد على أنها متسقة.
الإجراء غير ممكن لأن راديو Wi-Fi أو Bluetooth محظور بواسطة RF-kill. راجع rfkill list أو المفتاح الفعلي أو زر وضع الطيران.
صفحة الذاكرة بها خطأ عتادي وقد وسمتها النواة بأنها مسمومة.
نوع الملف غير مناسب للإجراء. موجود في macOS وBSD منذ زمن طويل؛ وأُضيف إلى Linux مؤخرًا.
يوجد عدد كبير جدًا من العمليات. يعرّفه BSD لحد العمليات، رغم أن fork يعيد في الواقع EAGAIN.
بنية RPC غير صحيحة (Sun RPC، الذي يستخدمه NFS).
إصدار RPC غير مطابق (Sun RPC، الذي يستخدمه NFS).
برنامج RPC غير متاح على الخادم.
إصدار برنامج RPC غير مطابق.
الإجراء غير موجود في برنامج RPC.
خطأ في المصادقة، مثلًا عند تركيب مورد NFS.
يلزم مُصادِق لهذا الإجراء.
الجهاز مطفأ.
خطأ في الجهاز، مثل طابعة نفد منها الورق.
الملف التنفيذي غير صالح.
الملف التنفيذي مخصص لنوع آخر من المعالجات، مثل ملف ثنائي x86_64 فقط على Mac بمعالج Apple Silicon دون Rosetta 2، أو ملف ARM على Mac بمعالج Intel.
إصدار المكتبة المشتركة غير مطابق.
ملف Mach-O مشوه أو تالف.
السمة الموسعة غير موجودة؛ يعادل ENODATA في Linux. يظهر مع xattr، مثلًا عند إزالة com.apple.quarantine من ملف لا يحملها.
لا توجد أي سياسة مسجلة بهذا الاسم في MAC Framework.
طابور الإخراج في واجهة الشبكة ممتلئ.
القدرات غير كافية: تعيده الاستدعاءات التي يقيّدها sandbox.
أُغلقت الطرفية التي كانت تتحكم في العملية أو انقطعت جلسة SSH. تستخدمها خدمات خلفية كثيرة، مثل nginx أو sshd أو rsyslog، كطلب لإعادة قراءة الإعدادات؛ وتمنع nohup وtmux وscreen أن تُنهي هذه الإشارة العمليات عند الخروج.
مقاطعة من لوحة المفاتيح بالضغط على Ctrl+C. يمكن للبرنامج التقاطها لينتهي بشكل منظم. رمز الخروج 130.
خروج من لوحة المفاتيح بالضغط على Ctrl+\. تُنهي العملية مع تفريغ الذاكرة؛ أما JVM فتستخدمها بدلًا من ذلك لطباعة حالة الخيوط.
صادف المعالج تعليمة غير مشروعة: ملف ثنائي مُصرَّف لمعالج أحدث (مثلًا مع AVX2 أو AVX-512 على معالج لا يدعمها)، أو كود تالف، أو قفزة إلى بيانات.
مصيدة تصحيح: تستخدمها أدوات التصحيح لنقاط التوقف. إذا وصلت دون مصحح، فهي غالبًا عطل اكتشفه البرنامج نفسه، مثل فحوصات Swift في macOS.
استدعت العملية abort(): تأكيد (assertion) فشل، أو استثناء C++ غير ملتقط، أو تلف في الـ heap اكتشفته مكتبة C («double free or corruption»). رمز الخروج 134.
القيمة نفسها:SIGIOT
خطأ ناقل (bus error): وصول إلى ذاكرة غير محاذاة في بعض المعماريات، أو إلى جزء من ملف معيّن بـ mmap لم يعد موجودًا لأن الملف اقتُطع. ويحدث أيضًا عند امتلاء /dev/shm.
استثناء حسابي. رغم الاسم، السبب الأكثر شيوعًا هو القسمة الصحيحة على صفر.
تُنهي العملية فورًا: لا يمكن التقاطها ولا حجبها ولا تجاهلها. يرسلها kill -9، وOOM killer في النواة عند نفاد الذاكرة، وDocker أو Kubernetes عندما تتجاوز حاوية حد ذاكرتها (OOMKilled) أو لا تنتهي في الوقت المحدد بعد SIGTERM. رمز الخروج 137.
إشارة حرة ليعطيها كل تطبيق استخدامه الخاص؛ مثلًا يعرض dd تقدمه ويعيد nginx فتح السجلات.
انتهاك تقسيم الذاكرة («Segmentation fault»): وصول إلى ذاكرة غير صالحة، مثل إلغاء مرجعية مؤشر فارغ، أو تجاوز حدود مصفوفة، أو تجاوز سعة المكدس بعودية لا نهائية. رمز الخروج 139.
إشارة حرة ثانية ليعطيها كل تطبيق استخدامه الخاص.
كتابة في pipe أو socket بلا قارئ. وهي طبيعية في cmd | head، حيث ينتهي القارئ أولًا؛ وعادةً ما تتجاهلها الخوادم وتعالج الخطأ EPIPE. رمز الخروج 141.
انتهى المؤقت المضبوط باستخدام alarm أو setitimer.
طلب إنهاء منظم. إنها الإشارة الافتراضية لـ kill وsystemctl stop وdocker stop ولـ Kubernetes عند حذف pod؛ ويجب على العملية إغلاق اتصالاتها والخروج. رمز الخروج 143.
عطل في مكدس المعالج المساعد. غير مستخدمة في Linux الحالي.
انتهت عملية ابن أو توقفت أو استأنفت. يجب على الأب جمعها باستخدام wait؛ وإن لم يفعل، تبقى العملية الابن عملية زومبي.
القيمة نفسها:SIGCLD
تستأنف عملية متوقفة، كما يفعل fg وbg في الـ shell.
توقف العملية؛ لا يمكن التقاطها ولا تجاهلها. تُستأنف باستخدام SIGCONT.
إيقاف من الطرفية بالضغط على Ctrl+Z. بخلاف SIGSTOP، يمكن للبرنامج التقاطها.
حاولت عملية في الخلفية القراءة من الطرفية.
حاولت عملية في الخلفية الكتابة إلى الطرفية مع تفعيل stty tostop، أو تغيير إعداداتها.
وصلت بيانات عاجلة (خارج النطاق) إلى socket. تستخدمها Go داخليًا لمقاطعة goroutines.
تم تجاوز حد وقت المعالج للعملية (ulimit -t).
تم تجاوز الحد الأقصى لحجم الملف المسموح للعملية (ulimit -f).
انتهى المؤقت الافتراضي، الذي يحسب وقت المعالج للعملية فقط.
انتهى مؤقت التحليل (profiling)، الذي تستخدمه أدوات الـ profiler.
تغيّر حجم نافذة الطرفية؛ تستخدمها برامج ملء الشاشة لإعادة رسم نفسها.
يتوفر إدخال/إخراج على واصف مضبوط بـ O_ASYNC. في Linux، SIGPOLL هي الإشارة نفسها.
القيمة نفسها:SIGPOLL
انقطاع الطاقة، الذي يبلّغ عنه برنامج UPS نظامَ init.
استدعاء نظام غير صحيح. السبب المعتاد اليوم هو مرشح seccomp يحظره، كما في الحاويات.
مصيدة محاكاة (EMT). موجودة في macOS وBSD، لكن ليس في Linux على x86 أو ARM.
طلب معلومات بالضغط على Ctrl+T في طرفية macOS وBSD؛ تستجيب أوامر كثيرة بعرض تقدمها.
انتهى الأمر بنجاح. إنه الرمز الوحيد الذي يعني النجاح: أي قيمة أخرى تدل على خطأ.
خطأ عام؛ كل برنامج يقرر معناه. تكون التفاصيل عادةً فيما كتبه الأمر في stderr. يستخدمه grep وdiff بمعنى آخر: «لم يُعثر على تطابقات» أو «الملفات مختلفة».
استخدام خاطئ لأمر مدمج في الـ shell أو خطأ في صياغة السكربت. تستخدمه برامج كثيرة أيضًا للخيارات غير الصالحة، ويستخدمه grep للأخطاء الحقيقية.
استُخدم الأمر بشكل خاطئ: وسائط ناقصة أو زائدة أو خيار غير صحيح.
بيانات الإدخال بتنسيق غير صحيح.
ملف إدخال غير موجود أو لا يمكن قراءته.
المستخدم المحدد غير موجود؛ تستخدمه برامج البريد بشكل خاص.
اسم المضيف غير موجود.
خدمة مطلوبة غير متاحة، أو فشل شيء لا يندرج في فئة أخرى.
خطأ داخلي في البرنامج.
خطأ في نظام التشغيل، مثل تعذر تنفيذ fork أو إنشاء pipe.
ملف نظام مفقود، مثل /etc/passwd، أو به خطأ.
لا يمكن إنشاء ملف إخراج.
خطأ إدخال/إخراج عند قراءة ملف أو الكتابة فيه.
فشل مؤقت: يُستحسن إعادة المحاولة لاحقًا. تستخدمه خوادم البريد لإبقاء الرسالة في الطابور.
أجاب النظام البعيد بشيء لا يلتزم بالبروتوكول.
أذونات غير كافية للإجراء.
يوجد خطأ في الإعدادات.
أنهاه الأمر timeout لأنه تجاوز الوقت المحدد.
فشل docker run نفسه قبل تشغيل الحاوية، مثلًا بسبب خيار غير صحيح أو خطأ في الـ daemon. ويعيده GNU timeout أيضًا عندما يكون هو الذي فشل.
الملف موجود لكن لا يمكن تنفيذه: ينقصه إذن التنفيذ، أو هو مجلد، أو ملف ثنائي لمعمارية أخرى. في Docker، أمر الحاوية غير قابل للتنفيذ.
لم يُعثر على الأمر: غير مثبت، أو ليس في PATH، أو اسمه مكتوب بشكل خاطئ. في السكربتات يظهر أيضًا عند غياب المفسر المذكور في سطر #!؛ وفي Docker، عندما لا يوجد أمر الحاوية في الصورة.
الرموز الأكبر من 128 تدل على أن إشارة أنهت العملية، لكن 128 لا يقابل أي إشارة. يستخدمه Git لكل أخطائه الفادحة («fatal: …»)، مثل مستودع غير موجود أو فشل المصادقة عند الاستنساخ.
رمز الخروج خارج النطاق: exit -1 يصل بالقيمة 255، لأنه لا يُحتفظ إلا بـ 8 بتات. ويعيده ssh أيضًا عند فشل الاتصال أو المصادقة، لتمييزه عن رمز الأمر البعيد.
قيم Linux هي الخاصة بمعماريات x86 وx86-64 وARM؛ أما Alpha وMIPS وSPARC وPA-RISC فترقّم بعض قيم errno والإشارات بشكل مختلف. الرسائل الإنجليزية هي التي تعرضها strerror وstrsignal في glibc، وتلك التي يعرضها macOS عندما تختلف. تُفسَّر رموز الخروج الأكبر من 128 على أنها 128 مضافًا إليها رقم الإشارة، وهو الاصطلاح المتبع في bash وDocker وKubernetes.
كيف يعمل
عندما يفشل استدعاء نظام في Linux، يعيد -1 ويضع في المتغير errno رقمًا يوضح السبب: 2 هو ENOENT، أي أن الملف غير موجود؛ و13 هو EACCES، أي أن الإذن مرفوض. تحوّل strerror هذا الرقم إلى النص الذي يظهر على الشاشة، مثل «No such file or directory». يعرضه Python بالشكل [Errno 13]، وNode.js بالشكل code: 'ECONNREFUSED'، وGo وRust وJava بالنص نفسه. الأرقام من 1 إلى 34 جاءت من Unix الأصلي وهي متطابقة في كل الأنظمة؛ أما ما بعدها فقد رقّمه كل نظام بطريقته، لذا فإن ECONNREFUSED هو 111 في Linux و61 في macOS. الاسم قابل للنقل؛ أما الرقم فلا.
الإشارات تنبيهات ترسلها النواة أو عملية أخرى إلى عملية ما: SIGINT عند الضغط على Ctrl+C، وSIGTERM لطلب إنهائها، وSIGKILL لإنهائها دون استئذان، وSIGSEGV عندما تصل إلى ذاكرة غير صالحة. لكل منها إجراء افتراضي، ويمكن التقاط معظمها للقيام بشيء آخر. عندما تقتل إشارةٌ عمليةً، يبلّغ الـ shell عن رمز خروج يساوي 128 مضافًا إليه رقم الإشارة: 137 هو SIGKILL (9)، و139 هو SIGSEGV (11)، و143 هو SIGTERM (15). ويتبع Docker وKubernetes الاصطلاح نفسه.
رمز الخروج هو الرقم الذي يتركه البرنامج عند انتهائه: 0 يعني النجاح وأي قيمة أخرى تعني خطأ. لا يُحتفظ إلا بـ 8 بتات، لذا يتراوح بين 0 و255. الاصطلاحات قليلة: 126 و127 يستخدمهما الـ shell عندما لا يستطيع تنفيذ الأمر أو لا يجده، والقيم من 64 إلى 78 يعرّفها sysexits.h في BSD، والباقي يقرره كل برنامج، مثل grep الذي يعيد 1 عندما لا يجد شيئًا.
أمثلة
Last State: Terminated · Reason: OOMKilled · Exit Code: 137137 = 128 + 9 · SIGKILLتجاوزت الحاوية حد ذاكرتها فقتلتها النواة بـ SIGKILL. يجب رفع الحد في resources.limits.memory أو البحث عن سبب استهلاك العملية لهذا القدر من الذاكرة؛ إعادة تشغيلها لا تحل المشكلة.Error: connect ECONNREFUSED 127.0.0.1:5432ECONNREFUSED · Linux 111 · macOS 61 · Connection refusedلم يتمكن Node.js من الاتصال بـ PostgreSQL لأن لا أحد يستمع على المنفذ 5432. إذا كان التطبيق يعمل في حاوية، فإن 127.0.0.1 هو الحاوية نفسها وليس الجهاز المضيف: يجب استخدام اسم خدمة قاعدة البيانات.OSError: [Errno 48] Address already in useEADDRINUSE · Linux 98 · macOS 48الرقم 48 يكشف أن البرنامج يعمل على macOS: في Linux الخطأ نفسه هو 98. وفي الحالتين تستخدم عملية أخرى المنفذ بالفعل؛ ويُظهر lsof -i :المنفذ أي عملية هي.حالات الاستخدام
- فهم خطأ في تطبيق مكتوب بـ Python أو Node.js أو Go أو C لا يعرض إلا رقم errno أو اسمه.
- معرفة سبب إغلاق حاوية Docker أو إعادة تشغيل pod في Kubernetes انطلاقًا من رمز الخروج.
- تحويل رقم errno في macOS إلى الاسم الصحيح، إذ لا يتطابق مع رقم Linux بدءًا من 35.
- تفسير رمز الخروج لسكربت أو مهمة cron أو مهمة CI فشلت.
- اختيار الإشارة التي تُرسل باستخدام kill ومعرفة ما تفعله العملية إن لم تلتقطها.
- كتابة معالجة أخطاء قابلة للنقل تقارن بالاسم بدلًا من الرقم.
الأسئلة الشائعة
ما معنى رمز الخروج (exit code) 137؟
يعني أن العملية انتهت بالإشارة 9، أي SIGKILL (128 + 9). السبب الأكثر شيوعًا هو الذاكرة: تجاوزت الحاوية حدها، ويبلّغ Kubernetes عن ذلك بـ OOMKilled، أو اختار OOM killer في النواة تلك العملية، وهو ما يُسجَّل في dmesg بالصيغة «Out of memory: Killed process». ويحدث أيضًا مع docker kill، أو عندما لا تنتهي العملية خلال المهلة بعد SIGTERM: 10 ثوانٍ في docker stop و30 في Kubernetes.
ما الفرق بين SIGTERM وSIGKILL؟
تطلب SIGTERM من العملية أن تنتهي، ويمكن للعملية التقاطها لإغلاق الاتصالات وحفظ البيانات والخروج. أما SIGKILL فتُنهي النواة بها العملية فورًا، دون أن تتمكن العملية من فعل أي شيء. الصواب هو إرسال SIGTERM، والانتظار بضع ثوانٍ، واللجوء إلى SIGKILL فقط إذا بقيت حية، وهذا ما يفعله systemd وdocker stop وKubernetes.
لماذا يحمل errno نفسه رقمًا مختلفًا في macOS؟
لأن POSIX يعرّف الأسماء لا الأرقام. من 1 إلى 34 ورثت كل الأنظمة أرقام Unix الأصلي؛ بعد ذلك رقّمها BSD، الذي انبثق منه macOS، وSystem V، الذي اتبعه Linux، كلٌّ على حدة. لذلك يُستحسن المقارنة دائمًا بالاسم، باستخدام errno.ECONNREFUSED في Python أو err.code في Node.js أو الثابت في C، وليس بالرقم.
ما الفرق بين EACCES وEPERM؟
يعني EACCES («Permission denied») أن أذونات الملف أو أحد مجلدات المسار لا تسمح بذلك، أو أن ACL أو SELinux يمنعه: ويُحل باستخدام chmod أو chown أو السياسة المناسبة. أما EPERM («Operation not permitted») فيعني أن الإجراء نفسه يتطلب امتيازات، بغض النظر عن الأذونات، مثل تغيير مالك ملف أو قتل عملية تخص مستخدمًا آخر: يلزم root أو capability أو إزالة سمة مثل سمة عدم القابلية للتغيير.
كيف أرى رمز الخروج لأمر أو لحاوية؟
في bash وzsh، يعرض echo $? رمز آخر أمر؛ وفي PowerShell، يعرضه $LASTEXITCODE. في Docker، يعرضه docker ps -a في عمود STATUS، مثل «Exited (137)». في Kubernetes، يعرضه kubectl describe pod في «Last State: Terminated»، مع السبب، مثل OOMKilled أو Error.