FLOCK(1) دستورهای کاربری FLOCK(1)

flock - مدیریت قفل‌های پرونده در اسکریپت‌های پوسته

flock [options] file|directory command [arguments]

flock [options] file|directory -c command

flock [options] number

این ابزار قفل‌های flock(2) را از درون اسکریپت‌های پوسته یا از خط فرمان مدیریت می‌کند.

حالت‌های اول و دوم از ساختارهای بالا، اجرای یک command را درون یک قفل قرار می‌دهند، به شیوه‌ای مشابه با su(1) یا newgrp(1). آن‌ها یک file یا directory مشخص‌شده را قفل می‌کنند، که در صورت عدم وجود (با فرض دسترسی‌های مناسب) ایجاد می‌شود. به‌طور پیش‌فرض، اگر قفل فوراً به دست نیاید، flock منتظر می‌ماند تا قفل در دسترس قرار گیرد.

حالت سوم از یک پروندهٔ باز بر اساس number توصیف‌گر پرونده (file descriptor) آن استفاده می‌کند. برای نحوهٔ استفاده از آن، مثال‌های زیر را ببینید.

-c, --command command

ارسال یک command منفرد، بدون آرگومان، به پوسته با -c.

-E, --conflict-exit-code number

وضعیت خروجی مورد استفاده هنگامی که گزینهٔ -n فعال است و قفل متداخل وجود دارد، یا گزینهٔ -w فعال است و مهلت زمانی به پایان می‌رسد. مقدار پیش‌فرض 1 است. مقدار number باید در بازهٔ 0 تا 255 باشد.

-F, --no-fork

پیش از اجرای command انشعاب (fork) ایجاد نمی‌کند. پس از اجرا، فرایند flock با command جایگزین می‌شود و همچنان قفل را نگه می‌دارد. این گزینه با --close ناسازگار است، چرا که در غیر این صورت چیزی برای نگه‌داشتن قفل باقی نمی‌ماند.

-e, -x, --exclusive

دریافت یک قفل انحصاری، که گاهی قفل نوشتن نامیده می‌شود. این حالت پیش‌فرض است.

-n, --nb, --nonblock

در صورت عدم امکان دستیابی فوری به قفل، به جای انتظار، ناموفق می‌شود. برای وضعیت خروجی مورد استفاده، گزینهٔ -E را ببینید.

-o, --close

بستن توصیف‌گر پرونده‌ای که قفل روی آن نگه داشته شده است پیش از اجرای command. این گزینه زمانی مفید است که command یک فرایند فرزند ایجاد می‌کند که نباید قفل را نگه دارد.

-s, --shared

دریافت یک قفل اشتراکی، که گاهی قفل خواندن نامیده می‌شود.

-u, --unlock

رهاسازی یک قفل. این کار معمولاً لازم نیست، زیرا با بسته شدن پرونده قفل به‌طور خودکار آزاد می‌شود. با این حال ممکن است در موارد خاصی مورد نیاز باشد، مثلاً اگر گروه دستورهای محصور فرایند پس‌زمینه‌ای ایجاد کرده باشد که نباید قفل را نگه دارد.

-w, --wait, --timeout seconds

در صورتی که قفل ظرف seconds ثانیه به دست نیاید، ناموفق می‌شود. مقادیر کسری اعشاری مجاز هستند. برای وضعیت خروجی مورد استفاده، گزینهٔ -E را ببینید. مقدار صفر seconds به صورت --nonblock تفسیر می‌شود.

--fcntl

به جای flock(2)، یک قفل توصیف پروندهٔ باز fcntl(2) اعمال می‌کند (یعنی استفاده از دستورهای F_OFD_SETLK (غیرمسدودکننده) یا F_OFD_SETLKW (مسدودکننده)). این قفل‌ها مستقل از قفل‌های اعمال‌شده از طریق flock(2) هستند، اما بر خلاف قفل‌های سنتی POSIX fcntl() (شامل F_SETLK و F_SETLKW)، معنایی مطابق با flock(2) دارند.

این قابلیت تنها در نگارش‌های هسته >= 3.15 در دسترس است.

--verbose

گزارش مدت زمانی که به دست آوردن قفل طول کشید، یا دلیل عدم دستیابی به قفل.

-h, --help

نمایش متن راهنما و خروج.

-V, --version

نمایش نگارش و خروج.

این دستور برای همه چیز از مقادیر وضعیت خروج <sysexits.h> استفاده می‌کند، به جز هنگام استفاده از هر یک از گزینه‌های -n یا -w که عدم موفقیت در به دست آوردن قفل را با وضعیت خروجی تعیین‌شده توسط گزینهٔ -E، یا مقدار پیش‌فرض 1 گزارش می‌دهند. وضعیت خروجی داده‌شده با -E باید در بازهٔ 0 تا 255 باشد.

هنگام استفاده از حالت command، اگر اجرای فرایند فرزند موفق باشد، وضعیت خروجی همان وضعیت خروجی دستور فرزند است.

دستور flock بن‌بست (deadlock) را تشخیص نمی‌دهد. برای جزئیات به flock(2) مراجعه کنید.

برخی سامانه‌های پرونده (مانند NFS و CIFS) پیاده‌سازی محدودی از flock(2) دارند و ممکن است flock همیشه با شکست مواجه شود. برای جزئیات به flock(2)، nfs(5) و mount.cifs(8) مراجعه کنید. بسته به گزینه‌های mount، ممکن است 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>

Copyright © 2003-2006 H. Peter Anvin. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

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-06-16 util-linux 2.41.5