این مثال توسط Charles Duffy (آنکه حالا کمی بیشتر به خاطر آن شرمنده است، و در عوض استفاده از flock را پیشنهاد میکند) ارائه گردیده. و به علت اینکه دارای چندین موضوع است که آن را مبهم و نامعلوم میسازد، از صفحه والدش مجزا گردیده است.
آیا ما مطمئن هستیم که این کُد صحیح است؟ به نظر میرسد مغایرتی میان نامهای LOCK_DEFAULT_NAME و DEFAULT_NAME وجود دارد، و پردازشهایی را که به نظر میآید یک مسابقه شرطی باشند، کنترل میکند، و فایل سیستم /proc مخصوص لینوکس و egrep -o ویژه گنو را برای عمل کردن، به کار میبرد.... بنابراین من آن را تصدیق نمیکنم. بیش از اندازه پیچیده و شکننده به نظر میآید. و کاملاً غیر قابل حمل است. -- GreyCat
LOCK_DEFAULT_NAME=$0 LOCK_HOSTNAME="$(hostname -f)" ## تابع برای گرفتن قفل، در صورتی که آزاد است، در غیر اینصورت شکست میخورد function grab-lock { local PROGRAMNAME="${1:-$LOCK_DEFAULT_NAME}" local PID=${2:-$$} ( umask 000; mkdir -p "/tmp/${PROGRAMNAME}-lock" mkdir "/tmp/${PROGRAMNAME}-lock/held" || return 1 mkdir "/tmp/${PROGRAMNAME}-lock/held/${LOCK_HOSTNAME}--pid-${PID}" && return 0 || return 1 ) 2>/dev/null return $? } ## تابع برای آزاد سازی قفل function release-lock { local PROGRAMNAME="${1:-$LOCK_DEFAULT_NAME}" local PID=${2:-$$} ( rmdir "/tmp/${PROGRAMNAME}-lock/held/${LOCK_HOSTNAME}--pid-${PID}" || true rmdir "/tmp/${PROGRAMNAME}-lock/held" && return 0 || return 1 ) 2>/dev/null return $? } ## تابعی جهت وادار کردن هر شخص دیگری به ملغی نمودن قفل function break-lock { local PROGRAMNAME="${1:-$LOCK_DEFAULT_NAME}" ( [ -d "/tmp/${PROGRAMNAME}-lock/held" ] || return 0 for DIR in "/tmp/${PROGRAMNAME}-lock/held/${LOCK_HOSTNAME}--pid-"* ; do OTHERPID="$(egrep -o '[0-9]+$' <<<"$DIR")" [ -d "/proc/${OTHERPID}" ] || rmdir "$DIR" done rmdir "/tmp/${PROGRAMNAME}-lock/held" && return 0 || return 1 ) 2>/dev/null return $? } ## تابعی برای به دست آوردن قفل، و در صورت لزوم ابتدا آزادسازی آن function get-lock { break-lock "$@" && grab-lock "$@" }
همکاری در پرسش و پاسخ 45 (آخرین ویرایش 2012-09-04 14:37:22 توسط net66-219-41-161)