فشل الإيقاف

الظاهرة:

عند تشغيل php start.php stop تظهر الرسالة stop fail

الاحتمال الأول

الشرط هو أنه تم تشغيل workerman بطريقة debug، حيث قام المطور في الطرفية بالضغط على ctrl z لإرسال إشارة SIGSTOP إلى workerman، مما أدى إلى دخول workerman في الخلفية وتوقفه (تجميد)، وبالتالي لا يمكنه الاستجابة لأمر الإيقاف (إشارة SIGINT).

الحل:
في الطرفية التي تم تشغيل workerman منها، أدخل fg (إرسال إشارة SIGCONT) ثم اضغط Enter، لإرجاع workerman إلى التشغيل في الواجهة الأمامية، ثم اضغط ctrl c (إرسال إشارة SIGINT) لإيقاف workerman.

إذا لم يكن بالإمكان الإيقاف، حاول تشغيل الأمرين التاليين

killall -9 php
ps aux|grep -i workerman|awk '{print $2}'|xargs kill -9

الاحتمال الثاني

المستخدم الذي يقوم بتشغيل أمر الإيقاف ليس هو نفس المستخدم الذي قام بتشغيل workerman، مما يعني أن مستخدم الإيقاف ليس لديه صلاحيات لإيقاف workerman.

الحل:
تبديل المستخدم إلى المستخدم الذي قام بتشغيل workerman، أو استخدام مستخدم بامتيازات أعلى لإيقاف workerman.

الاحتمال الثالث

تم حذف ملف pid للعملية الرئيسية لـ workerman، مما أدى إلى عدم قدرة السكربت على العثور على عملية pid، مما تسبب في فشل الإيقاف.

الحل:
قم بحفظ ملف pid في مكان آمن، انظر الدليل Worker::$pidFile

الاحتمال الرابع

ملف pid للعملية الرئيسية لـ workerman لا يتطابق مع عملية workerman.

الحل:
افتح ملف pid للعملية الرئيسية لـ workerman لعرض عملية pid، ملف pid افتراضيًا موجود في نفس الدليل مع Workerman. قم بتشغيل الأمر ps aux | grep 主进程pid للتحقق مما إذا كانت العملية تتطابق مع عملية Workerman، إذا لم تكن كذلك، فقد يكون الخادم قد أُعيد تشغيله، مما أدى إلى أن يكون pid المحفوظ من workerman هو pid منتهي الصلاحية، وكان هذا pid قد تم استخدامه بواسطة عمليات أخرى، مما أدى إلى فشل الإيقاف. إذا كان الأمر كذلك، يمكنك ببساطة حذف ملف pid.

الاحتمال الخامس

تم تثبيت امتداد grpc، ولكن لم يتم تعيين المتغيرات البيئية المناسبة له، مما يؤدي إلى إنشاء عملية مرتبطة إضافية بعد البدء، مما ينتج عنه فشل أثناء الإيقاف.