الفخاخ: اجعل نصوص bash أكثر قوة

أثناء تصفح الشبكة الوطنية صادفت أ مقال مثير للاهتمام (الذي أحضره هنا نصيًا لأنه موضح ببراعة) حيث يوضح لنا مؤلفه كيفية جعل نصوص Bash أكثر قوة باستخدام الفخاخ.

اجعل نصوص bash أكثر قوة باستخدام الفخاخ

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

تعتبر Traps طريقة بسيطة وفعالة للتحكم في إخراج نصوص bash. دعنا نعود إلى نفس الموقف الأولي ، إذا تم إيقاف البرنامج النصي يدويًا ، على سبيل المثال باستخدام ctrl-c ، يتم مقاطعته لإرجاع إشارة الإخراج

INT

وإذا انتهى بـ

kill

ثم سيكون الناتج

TERM.

يمكن الاطلاع على جميع رموز الخروج الممكنة باستخدام

kill -l

لكن الأكثر استخدامًا هي على وجه التحديد

INT ، TERM ، EXIT

إذا كان البرنامج النصي يتكون ، على سبيل المثال ، من مزامنة الملفات مع

rsync

الشيء الأكثر منطقية هو الاعتماد على ملف قفل لا يسمح بتشغيل البرنامج النصي في وقت واحد:

LOCK = "/ var / run / rsync.lock" إذا [! -e $ LOCK] ؛ ثم المس $ LOCK rsync -avz foo bar rm $ LOCK وإلا صدى "rsync قيد التشغيل بالفعل" fi

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

ومع ذلك ، عندما يكون هناك موقف إشكالي ، فقد يحدث عدم حذف ملف القفل ، مما يؤدي إلى إتلاف التأثيرات غير المرغوب فيها. والحل بسيط جدا:

LOCK = "/ var / run / rsync.lock" إذا [! -e $ LOCK] ؛ ثم trap "rm -f $ LOCK ؛ خروج" INT TERM EXIT touch $ LOCK rsync -avz foo bar rm $ LOCK trap - INT TERM EXIT وإلا صدى "rsync قيد التشغيل بالفعل" fi

خصوصية هذا الحل هو أن الأمر محاط بمصيدة ، بحيث يتم استقبال إشارة

INT ، TERM ، EXIT

يتوقف البرنامج النصي ويمسح ملف القفل.

تجدر الإشارة إلى أنه قد تكون هناك حالة منافسة في البرنامج النصي أعلاه بين وقت التحقق من ملف القفل ووقت إنشائه. يتمثل أحد الحلول الممكنة في استخدام وضع إعادة التوجيه و noclobber الخاص بـ bash والذي لا يعيد التوجيه إلى ملف موجود:

LOCK = "/ var / run / rsync.lock" if (set -o noclobber؛ echo $$> "$ LOCK") 2> / dev / null ؛ ثم trap 'rm -f "$ LOCK" ؛ الخروج $؟ INT TERM EXIT rsync -avz foo bar rm -f $ LOCK trap - INT TERM EXIT وإلا صدى "rsync قيد التشغيل بالفعل: $ (cat $ LCK)" fi

خصوصية هذا الأخير هو أنه يتم استخدامه كما قلت بالفعل ، وضع noclobber وأن ملف القفل يحتوي على PID للعملية التي يتم تنفيذها.

ومن الجدير بالذكر أيضًا أن هناك حلولًا أخرى مثل

flock

o

solo

لكن في هذا المنشور أردت مشاركة الحلول مع موارد bash الخاصة. يمكنك معرفة المزيد عن المصائد باستخدام هذا دليل ممتاز.


محتوى المقال يلتزم بمبادئنا أخلاقيات التحرير. للإبلاغ عن خطأ انقر فوق هنا.

5 تعليقات ، اترك لك

اترك تعليقك

لن يتم نشر عنوان بريدك الإلكتروني.

*

*

  1. المسؤول عن البيانات: ميغيل أنخيل جاتون
  2. الغرض من البيانات: التحكم في الرسائل الاقتحامية ، وإدارة التعليقات.
  3. الشرعية: موافقتك
  4. توصيل البيانات: لن يتم إرسال البيانات إلى أطراف ثالثة إلا بموجب التزام قانوني.
  5. تخزين البيانات: قاعدة البيانات التي تستضيفها شركة Occentus Networks (الاتحاد الأوروبي)
  6. الحقوق: يمكنك في أي وقت تقييد معلوماتك واستعادتها وحذفها.

  1.   رافائيل كاسترو قال

    عظيم! شكرا للمشاركة.

  2.   nx قال

    مقال رائع ، ما عليك سوى تغيير "echo" يعمل rsync بالفعل: $ (cat $ LCK) "" إلى "echo" يعمل rsync بالفعل: $ (cat $ LOCK) ""

    تحياتي

  3.   دجلانجوس قال

    مقال ممتع جدا ، نعم سيدي! هذا ما احتفظ به.

  4.   خواكين قال

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

  5.   داني ف قال

    ممتع جدا ، نعم سيدي.