این مثال توسط 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)