FLOCK(1) أوامر المستخدم FLOCK(1)

الاسم

flock - إدارة الأقفال من سكربتات الصدفة

موجز

flock [خيارات] ملف|‎دليل ‎أمر [‎وسائط]

flock [خيارات] ملف|‎دليل -c أمر

flock [خيارات] رقم

الوصف

تدير هذه الأداة أقفال flock(2) من داخل سكربتات الصدفة أو من سطر الأوامر.

الصيغتان الأولى والثانية أعلاه تغلّف القفل حول تنفيذ أمر ما، بطريقة مشابهة لـ su(1) أو newgrp(1). هما تقفلان ملفاً أو دليلاً محدداً، والذي يُنشأ (بافتراض الأذونات المناسبة) إذا لم يكن موجوداً بالفعل. مبدئياً، إذا تعذر الحصول على القفل فوراً، ينتظر flock حتى يصبح القفل متاحاً.

تستخدم الصيغة الثالثة ملفاً مفتوحاً بواسطة رقم واصف الملف الخاص به. انظر الأمثلة أدناه لمعرفة كيفية استخدام ذلك.

الخيارات

-c، --command أمر

مرّر أمراً واحداً، دون وسائط، إلى الصدفة باستخدام -c.

-E، --conflict-exit-code رقم

حالة الخروج المستخدمة عند استخدام الخيار -n ووجود قفل متعارض، أو عند استخدام الخيار -w وانتهاء المهلة. القيمة المبدئية هي 1. يجب أن يكون الـ رقم في النطاق من 0 إلى 255.

-F، --no-fork

لا تقم بالتفريع (fork) قبل تنفيذ الـ أمر. عند التنفيذ، تُستبدل عملية flock بواسطة الـ أمر الذي يستمر في الاحتفاظ بالقفل. هذا الخيار غير متوافق مع --close لأنه لولا ذلك لن يتبقى شيء للاحتفاظ بالقفل.

-e، -x، --exclusive

الحصول على قفل حصري، يسمى أحياناً قفل كتابة. هذا هو المبدئي.

-n، --nb، --nonblocking

اخفق بدلاً من الانتظار إذا تعذر الحصول على القفل فوراً. انظر الخيار -E لمعرفة حالة الخروج المستخدمة.

-o، --close

أغلق واصف الملف الذي يُحتفظ بالقفل عليه قبل تنفيذ الـ أمر. هذا مفيد إذا قام الـ أمر بتوليد عملية ابنة لا ينبغي لها الاحتفاظ بالقفل.

-s، --shared

الحصول على قفل مشترك، يسمى أحياناً قفل قراءة.

-u، --unlock

تخلَّ عن قفل. لا يُطلب هذا عادةً، بما أن القفل يُترك آلياً عند إغلاق الملف. ومع ذلك، قد يكون مطلوباً في حالات خاصة، على سبيل المثال إذا كانت مجموعة الأوامر المضمنة قد فرّعت عملية خلفية لا ينبغي لها الاحتفاظ بالقفل.

-w، --wait، --timeout ثوانٍ

اخفق إذا تعذر الحصول على القفل خلال ثوانٍ. القيم العشرية الكسرية مسموح بها. انظر الخيار -E لمعرفة حالة الخروج المستخدمة. تُفسر القيمة صفر للـ ثوانٍ على أنها --nonblock.

--fcntl

بدلاً من flock(2)، طبق قفل وصف ملف مفتوح عبر fcntl(2) (أي باستخدام الأوامر F_OFD_SETLK (غير حاجب) أو F_OFD_SETLKW (حاجب)). هذه الأقفال مستقلة عن تلك المطبقة عبر flock(2)، لكنها على عكس أقفال POSIX fcntl(2) التقليدية (F_SETLK و F_SETLKW)، تمتلك دلالات مطابقة لدلالات flock(2).

هذا متاح فقط في إصدارات النواة >= 3.15.

--start إزاحة

إزاحة البداية للقفل. هذا الخيار يتضمن --fcntl.

--length رقم

عدد البايتات المراد قفلها. هذا الخيار يتضمن --fcntl.

--verbose

أبلغ عن الوقت المستغرق للحصول على القفل، أو عن سبب عدم إمكانية الحصول عليه.

-h، --help

اعرض نص المساعدة ثم اخرج.

-V، --version

اعرض الإصدار واخرج.

حالة الخروج

يستخدم الأمر قيم حالة الخروج من <sysexits.h> لكل شيء، باستثناء عند استخدام أي من الخيارين -n أو -w اللذين يبلغان عن فشل في الحصول على القفل بحالة خروج يعطيها الخيار -E، أو 1 مبدئياً. يجب أن تكون حالة الخروج المعطاة بواسطة -E في النطاق من 0 إلى 255.

عند استخدام متغير أمر، وإذا نجح تنفيذ الابن، تكون حالة الخروج هي حالة أمر الابن.

ملاحظات

لا يكشف flock عن حالة الاستعصاء (deadlock). انظر flock(2) للتفاصيل.

تمتلك بعض أنظمة الملفات (مثلاً NFS و CIFS) تطبيقاً محدوداً لـ flock(2) وقد يفشل flock دائماً. للتفاصيل انظر flock(2) و nfs(5) و mount.cifs(8). اعتماداً على خيارات الوصل، قد يفشل flock دائماً هناك.

أمثلة

لاحظ أن "shell> " في الأمثلة هي محث سطر الأوامر.

shell1> flock /tmp -c cat; shell2> flock -w .007 /tmp -c echo; /bin/echo $?

يُعيّن قفل حصري للدليل /tmp وسيفشل الأمر الثاني.

shell1> flock -s /tmp -c cat; shell2> flock -s -w .007 /tmp -c echo; /bin/echo $?

يُعيّن قفل مشترك للدليل /tmp ولن يفشل الأمر الثاني. لاحظ أن محاولة الحصول على قفل حصري بالأمر الثاني ستفشل.

shell> flock -x local-lock-file echo 'a b c'

الاستحواذ على القفل الحصري "local-lock-file" قبل تشغيل echo مع 'a b c'.

(; flock -n 9 || exit 1; # ... commands executed under lock ...; ) 9>/var/lock/mylockfile

هذه الصيغة ملائمة داخل سكريبتات الصدفة. لا يهم الوضع المستخدم لفتح الملف بالنسبة لـ flock؛ إذ يسمح استخدام > أو >> بإنشاء ملف القفل إذا لم يكن موجودًا بالفعل، ومع ذلك، فإن إذن الكتابة مطلوب. أما استخدام < فيتطلب وجود الملف مسبقًا ولكن يُطلب إذن القراءة فقط.

[ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en "$0" "$0" "$@" || :

هذه شيفرة نمطية مفيدة لسكريبتات الصدفة. ضعها في الجزء العلوي من سكريبت الصدفة الذي تريد قفله وسيُقفل نفسه آليًا عند التشغيل الأول. إذا لم يُضبط متغير البيئة $FLOCKER على سكريبت الصدفة الذي يجري تشغيله، فسيُنفذ flock ويستحوذ على قفل حصري غير حاجب (باستخدام السكريبت نفسه كملف قفل) قبل إعادة تنفيذ نفسه بالوسائط الصحيحة. كما يضبط متغير البيئة FLOCKER على القيمة الصحيحة حتى لا يعمل مرة أخرى.

shell> exec 4<>/var/lock/mylockfile; shell> flock -n 4

هذه الصيغة ملائمة لقفل ملف دون إنشاء عملية فرعية. تفتح الصدفة ملف القفل للقراءة والكتابة كواصف ملف 4، ثم يُستخدم flock لقفل الواصف.

المؤلفين

H. Peter Anvin <hpa@zytor.com>

حقوق النسخ

حقوق النشر © 2003-2006 H. Peter Anvin. هذا برمجيات حرة؛ انظر المصدر لشروط النسخ. لا يوجد أي ضمان؛ ولا حتى ضمان القابلية للتسويق أو الملاءمة لغرض معين.

انظر أيضاً

flock(2)، fcntl(2)

التبليغ عن الأخطاء

لتقارير العِلل، استخدم مُتتبع المشكلات https://github.com/util-linux/util-linux/issues.

التوفر

الأمر flock جزء من حزمة util-linux التي يمكن تنزيلها من أرشيف نواة لينكس https://www.kernel.org/pub/linux/utils/util-linux/.

2026-05-18 util-linux 2.42.1