كيفية تشغيل نص Bash تلقائيًا عند الانتهاء من وظائف QSUB على خادم؟

StackOverflow https://stackoverflow.com/questions/3886168

سؤال

أرغب في تشغيل برنامج نصي عندما يتم الانتهاء من جميع الوظائف التي أرسلتها إلى خادم.

على سبيل المثال ، أرسل

ssh server "for i in config*; do qsub ./run 1 $i; done"

وأعود قائمة بالوظائف التي بدأت. أرغب تلقائيًا في بدء برنامج نصي آخر على الخادم لمعالجة الإخراج من هذه الوظائف بمجرد اكتمال كل شيء.

سأقدر أي نصيحة من شأنها أن تساعدني في تجنب الحل التالي:

إذا قمت بحفظ كل من معرف الوظائف 1000 من المكالمة أعلاه في ملف منفصل ، فيمكنني التحقق من محتويات كل ملف مقابل القائمة الحالية لوظائف التشغيل ، أي إخراج من مكالمة إلى:

ssh qstat

سأحتاج فقط إلى التحقق من كل نصف ساعة ، لكنني أتخيل أن هناك طريقة أفضل.

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

المحلول

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

تتمثل إحدى الطرق المفيدة للغاية لإدارة الكثير من الوظائف ذات الصلة في الإصدارات الأكثر حداثة من عزم الدوران (ومع محرك الشبكة ، وغيرها) في إطلاق أي وظائف فردية كصفيف عمل (راجع http://docs.adaptivecomputing.com/torque/4-1-4/content/topics/commands/qsub.htm#-t). هذا يتطلب تعيين الفرد يدير إلى الأرقام بطريقة أو بأخرى ، والتي قد تكون أو لا تكون مريحة ؛ ولكن إذا كان بإمكانك القيام بذلك من أجل وظائفك ، فسيؤدي ذلك إلى تبسيط إدارة الوظائف بشكل كبير ؛ يمكنك QSUB لهم جميعًا في سطر واحد ، يمكنك QDEL أو QHOLD لهم جميعًا مرة واحدة (مع الاستمرار في القدرة على التعامل مع الوظائف بشكل فردي).

إذا قمت بذلك ، فيمكنك تقديم وظيفة تحليل كانت لها اعتماد على مجموعة الوظائف التي ستعمل فقط بمجرد اكتمال جميع الوظائف في المصفوفة: (راجع http://docs.adaptivecomputing.com/torque/4-1-4/content/topics/commands/qsub.htm#dependency). سيبدو تقديم الوظيفة:

qsub analyze.sh -W depend=afterokarray:427[]

حيث كان لدى Analyze.sh البرنامج النصي لإجراء التحليل ، و 427 سيكون معرف الوظيفة لمجموعة الوظائف التي أطلقتها. ([] يعني تشغيل فقط بعد كل شيء). يختلف بناء الجملة للجدولين الآخرين (على سبيل المثال ، SGE/OGE) ولكن الأفكار هي نفسها.

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

نصائح أخرى

شيء قد تفكر فيه هو وجود كل نص عمل فقط لمس اسم الملف في مجلد مخصص مثل $i.jobdone, وفي البرنامج النصي الرئيسي ، يمكنك ببساطة استخدام ls *.jobdone | wc -l لاختبار العدد الصحيح من الوظائف المنجزة.

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

سأكتب برنامج C صغيرًا للقيام بالانتظار والتجميع (إذا كان لديك أذونات لتحميل وتشغيل المواد التنفيذية) ، ولكن يمكنك بسهولة استخدام Bash انتظر مدمج في نفس الغرض تقريبًا ، وإن كان مع مرونة أقل.

يحرر: مثال صغير.

#!/bin/bash

...
waitfor=''

for i in tasks; do
    task &
    waitfor="$waitfor $!"
done

wait $waitfor
...

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

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