سؤال

لدي عدد ضخم من أوامر Shell التي يتم تنفيذها باستخدام Root / Admin Priveleges من خلال دعوة خدمات التفويض "AuthorationExecuteWithplages". المشكلة هي أنه بعد فترة من الوقت (10-15 ثانية، ربما 100 أوامر Shell) يتوقف البرنامج عن الاستجابة بهذا الخطأ في مصحح الأخطاء:

لا يمكن أن شوكة: errno 35

ثم أثناء تشغيل التطبيق، لا يمكنني تشغيل أي تطبيقات أخرى. لقد بحثت هذه المشكلة، ويبدو أنها تعني أنه لا توجد المزيد من المواضيع المتاحة للنظام لاستخدامها. ومع ذلك، فقد راجعت استخدام مراقب النشاط وتطبيقي يستخدم فقط 4-5 مؤشرات الترابط.

لإصلاح هذه المشكلة، أعتقد أن ما أحتاج إليه هو منفصلة أوامر Shell في مؤشر ترابط منفصل (بعيدا عن الخيط الرئيسي). لم أستخدم خيوط من قبل، وأنا غير متأكد من أين أن أبدأ (لا توجد أمثلة شاملة يمكن أن أجدها)

شكرا

هل كانت مفيدة؟

المحلول

كما أشار لويس جيربرج بالفعل، فإن سؤالك لا علاقة له بالصيائح. لقد قمت بتحرير عنوانك والعلامات وفقا لذلك.

لدي عدد ضخم من أوامر Shell التي يتم تنفيذها باستخدام Root / Admin Priveleges من خلال دعوة خدمات التفويض "AuthorationExecuteWithplages".

لا تفعل ذلك. هذه الوظيفة موجودة فقط حتى تتمكن من استعادة الجذر: ملكية المسؤول وتضاعف الوضع SetUID إلى الأداة التي تريد تشغيلها كجذر.

الفكرة هي أنه يجب عليك العوم على التعليمات البرمجية التي يجب تشغيلها كجذر في برنامج منفصل تماما من الجزء الذي لا يحتاج إلى تشغيله كجذر، بحيث يكون الجزء الذي يحتاج إلى الجذر يمكن أن يكون له (من خلال Bit Setuid) و الجزء الذي لا يحتاج إلى الجذر يمكن أن تذهب دون ذلك (من خلال عدم وجود setuid).

مثال رمز في دليل برمجة خدمات التفويض.

المشكلة هي أنه بعد فترة من الوقت (10-15 ثانية، ربما 100 أوامر Shell) يتوقف البرنامج عن الاستجابة بهذا الخطأ في مصحح الأخطاء:

couldn't fork: errno 35

نعم. يمكنك فقط تشغيل بضع مئات من العمليات في وقت واحد. هذا هو الحد الذي إنفاذ نظام التشغيل.

إنه حد لينة، مما يعني أنه يمكنك رفعه - ولكن فقط حتى الحد الثابت، الذي لا يمكنك رفعه. انظر إخراج limit و limit -h (في زاش، أنا لا أعرف عن قذائف أخرى).

تحتاج إلى الانتظار للعمليات التي يجب الانتهاء منها قبل تشغيل المزيد من العمليات.

ثم أثناء تشغيل التطبيق، لا يمكنني تشغيل أي تطبيقات أخرى.

لأنك تقوم بالفعل بتشغيل العديد من العمليات كما يسمح لك بذلك. أن حد X-مائة عملية هو المستخدم لكل مستخدم، وليس لكل عملية.

لقد بحثت هذه المشكلة، ويبدو أنها تعني أنه لا توجد المزيد من المواضيع المتاحة للنظام لاستخدامها.

لا، ليس كذلك.

يتم استخدام رموز خطأ ErrNO للعديد من الأشياء. EAGAIN (35، "الموارد غير متوفرة مؤقتا") قد لا يعني عدم وجود المزيد من المواضيع عند تحديدها بواسطة مكالمة النظام التي تبدأ مؤشر ترابط، ولكنها لا تعني أنه عند تعيينه بواسطة مكالمة نظام أو وظيفة أخرى.

تقول رسالة الخطأ التي نقلت عنها صراحة أنه تم تعيينه بواسطة fork, ، وهو دعوة النظام لبدء جديد معالجة, وليس جديدا مسلك. وبعد في هذا السياق، EAGAIN يعني "أنت تعمل بالفعل أكبر عدد ممكن من العمليات كما يمكنك". يرى شوكة manpage..

ومع ذلك، فقد راجعت استخدام مراقب النشاط وتطبيقي يستخدم فقط 4-5 مؤشرات الترابط.

يرى؟

لإصلاح هذه المشكلة، أعتقد أن ما أحتاج إليه هو منفصلة أوامر Shell في مؤشر ترابط منفصل (بعيدا عن الخيط الرئيسي).

بدء عملية واحدة لكل موضوع تساعدك فقط في نفاد العمليات بشكل أسرع بكثير.

أنا لم أستخدم الخيط قبل ...

يبدو أنك لا تزال لم تفعل ذلك، لأن الوظيفة التي تشير إليها لبدء عملية، وليس مؤشر ترابط.

نصائح أخرى

هذا ليس عن المواضيع (على الأقل عدم المواضيع في التطبيق الخاص بك). هذا عن موارد النظام. تستهلك كل من تلك العمليات المتشعبة مؤشر ترابط Kernel واحد على الأقل (ربما أكثر)، وبعض vnodes، وعدد من الأشياء الأخرى. في النهاية لن يسمح لك النظام بتفرخ المزيد من العمليات.

الحدود الأولى التي تضغط عليها هي حدود إدارية. يمكن للنظام دعم المزيد، لكنه قد يسبب أدائا متدهورة وغيرها من القضايا. يمكنك عادة رفع هذه من خلال العديد من الأثاريات، مثل Systls. بشكل عام القيام به هذه فكرة سيئة ما لم يكن لديك حمولة عمل خاصة (خاصة) تعرف أنها ستستفيد من القرص المحدد.

فرص تربية تلك الحدود لن إصلاح مشاكلك. أثناء ضبط هذه الحدود قد يجعلك تعمل لفترة أطول قليلا، من أجل إصلاحه في الواقع، تحتاج إلى معرفة سبب عدم إرجاع الموارد إلى النظام. بناء على ما وصفته أعلاه، أعتقد أن عملياتك المترتبة على الخروج أبدا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top