حالة تعارض في القفل مشترك بشأن الملف؟
سؤال
وهذا هو نهج موحد لخلق أقفال استخدام نظام الملفات. على سبيل المثال، يستخدم visudo ما يلي:
[ -f ".lock" ] && exit 1
touch .lock
# do something
rm .lock
1) أنا مرتبك، لهناك حالة تعارض، ولكن لينكس يستخدمه
2) هل هناك طريقة أفضل لقفل على الملفات من قذيفة؟
و3) أو لا بد لي من استخدام الدلائل بدلا من ذلك؟
وجدت الحل: رجل lockfile
المحلول
نعم، هو في الواقع هناك حالة تعارض في البرنامج النصي عينة. يمكنك استخدام الخيار noclobber باش من أجل الحصول على الفشل في حالة سباق، عندما يتسلل نصي مختلفة في فترة ما بين الاختبار واللمس.
هنا . لقد نشرت مقتطفات منه قطعة حرج، مع اثنين من الشروح (مسبوقة من قبل BK:):
<اقتباس فقرة>وأحد الحلول الممكنة لهذه المشكلة هو استخدام IO إعادة توجيه ووضع noclobber باش، والتي لن إعادة توجيه إلى ملف موجود. يمكننا استخدام شيء مشابه:
اقتباس فقرة>if ( set -o noclobber; echo "$$" > "$lockfile") 2> /dev/null;
then
# BK: this will cause the lock file to be deleted in case of other exit
trap 'rm -f "$lockfile"; exit $?' INT TERM EXIT
# critical-section BK: (the protected bit)
rm -f "$lockfile"
trap - INT TERM EXIT
else
echo "Failed to acquire lockfile: $lockfile."
echo "Held by $(cat $lockfile)"
fi
نصائح أخرى
وحاول قيادة القطيع:
exec 200>"$LOCK_FILE"
flock -e -n 200 || exit 1
ووسيتم إنهاء إذا تم تأمين ملف القفل. ومن الذري وأنها ستعمل على النسخة الأخيرة من NFS.
ولقد فعلت ذلك لاختبار. لقد خلق ملف مواجهة مع 0 في ذلك، وتنفيذ ما يلي في حلقة على خوادم اثنين في وقت واحد 500 مرة:
#!/bin/bash
exec 200>/nfs/mount/testlock
flock -e 200
NO=`cat /nfs/mount/counter`
echo "$NO"
let NO=NO+1
echo "$NO" > /nfs/mount/counter
واحد العقدة كان يقاتل مع الآخر للقفل. عندما أنهى كل من يدير كان محتوى الملف 1000. لقد حاولت عدة مرات ودائما يعمل!
ملحوظة: عميل NFS هو RHEL 5.2 والخادم المستخدم هو نت
وقفل السيناريو الخاص بك (ضد التشغيل على التوازي)
http://wiki.bash-hackers.org/howto/mutex
ولمعلوماتك.
ويبدو لقد وجدت الحل الأسهل: رجل lockfile