كيف يمكنني التحقق من رمز الخروج لأمر تم تنفيذه بواسطة Flock؟

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

سؤال

تحيات الجميع. أقوم بإعداد وظيفة cron لتنفيذ برنامج نصي bash ، وأنا قلق من أن تبدأ الوظيفة التالية قبل أن ينتهي المنتهي السابقة. يكشف القليل من Googling أن طريقة شائعة لمعالجة هذا هي flock الأمر ، يستخدم بالطريقة التالية:

flock -n lockfile myscript.sh
if [ $? -eq 1 ]; then
    echo "Previous script is still running!  Can't execute!"
fi

هذا يعمل بشكل رائع. ومع ذلك ، ماذا أفعل إذا أردت التحقق من رمز الخروج من myscript.sh؟ أيا كان رمز الخروج الذي يعيده سيتم الكتابة عليه بواسطة flockلذلك ، لذلك ليس لدي أي طريقة لمعرفة ما إذا كان قد تم تنفيذه بنجاح أم لا.

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

المحلول

يبدو أنه يمكنك استخدام النموذج البديل لـ flock, flock <fd>, ، أين <fd> هو واصف ملف. إذا وضعت هذا في Subshell ، وقمت بإعادة توجيه واصف الملف إلى ملف القفل الخاص بك ، فإن Flock سينتظر حتى يتمكن من الكتابة إلى هذا الملف (أو خطأ إذا لم تتمكن -n). يمكنك بعد ذلك القيام بكل شيء في Subshell ، بما في ذلك اختبار قيمة الإرجاع للنصوص التي تقوم بتشغيلها:

(
  if flock -n 200
  then
    myscript.sh
    echo $?
  fi
) 200>lockfile

نصائح أخرى

#!/bin/bash

if ! pgrep myscript.sh; then
  flock -n lockfile myscript.sh
fi

إذا كنت تفهمك بشكل صحيح ، فأنت تريد التأكد من أن "myscript.sh" لا يعمل قبل أن يحاول كرون تشغيل أمرك مرة أخرى. على افتراض أن هذا صحيح ، فإننا نتحقق لمعرفة ما إذا كان PGREP فشل في العثور على myscript.sh في قائمة العمليات وإذا كان الأمر كذلك ، فسنقوم بتشغيل أمر Flock مرة أخرى.

ربما شيء من هذا القبيل من شأنه أن يعمل من أجلك.

#!/bin/bash
RETVAL=0
lockfailed()
{
        echo "cannot flock"
        exit 1
}
(
        flock -w 2 42 || lockfailed
        false
        RETVAL=$?
        echo "original retval $RETVAL"
        exit $RETVAL
) 42>|/tmp/flocker
RETVAL=$?
echo "returned $RETVAL"
exit $RETVAL
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top