آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

پاسخ همکارانه به پرسش شماره ۴۵

پاسخ همکارانه به پرسش شماره ۴۵

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