سؤال

وهذا هو نهج موحد لخلق أقفال استخدام نظام الملفات. على سبيل المثال، يستخدم 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

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