كيف يمكنني التحقق من رمز الخروج لأمر تم تنفيذه بواسطة Flock؟
-
21-09-2019 - |
سؤال
تحيات الجميع. أقوم بإعداد وظيفة 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