SEM(1) parallel SEM(1)

sem - سمافور برای اجرای موازی خطوط فرمان در شل

sem [--fg] [--id <id>] [--semaphore-timeout <secs>] [-j <num>] [--wait] command

ابزار GNU sem یک نام مستعار برای GNU parallel --semaphore است.

ابزار GNU sem مانند یک سمافور شمارشی عمل می‌کند. زمانی که GNU sem به همراه یک دستور فراخوانی شود، آن دستور را در پس‌زمینه اجرا می‌کند. هنگامی که تعداد num دستور در پس‌زمینه در حال اجرا باشند، GNU sem پیش از شروع دستور جدید منتظر می‌ماند تا یکی از آن‌ها به پایان برسد.

ابزار GNU sem هیچ آرگومانی را برای ساختن دستور نمی‌خواند (فاقد -a، ::: و ::::). این ابزار صرفاً منتظر در دسترس قرار گرفتن یک سمافور می‌ماند و سپس دستور داده‌شده را اجرا می‌کند.

پیش از بررسی گزینه‌ها، شاید مایل باشید مثال‌های پس از فهرست گزینه‌ها را بررسی کنید. این کار دید مناسبی از قابلیت‌های GNU sem به شما خواهد داد..SH "گزینه‌ها (OPTIONS)"

دستوری که باید اجرا شود. پس از دستور می‌تواند آرگومان‌های آن قرار گیرد.
اجرای دستور در پس‌زمینه؛ بنابراین GNU sem پیش از خروج، منتظر تکمیل دستور نخواهد ماند. این حالت پیش‌فرض است.

در تمثیل دستشویی: GNU sem منتظر خالی شدن یک دستشویی می‌ماند، آن را به یک شخص می‌سپارد و بلافاصله خارج می‌شود.

همچنین ببینید: --fg

اجرای حداکثر N دستور به صورت موازی. مقدار پیش‌فرض 1 است که همانند یک mutex (قفل متقابل) عمل می‌کند.

در تمثیل دستشویی: -j تعداد دستشویی‌ها است.

افزودن N به تعداد هسته‌های CPU. اجرای موازی کارها تا سقف این مقدار. برای کارهای با بار پردازشی سنگین، -j +0 مفید است، چرا که دقیقاً به تعداد هسته‌های پردازنده کارها را هم‌زمان اجرا می‌کند.
کسر کردن N از تعداد هسته‌های CPU. اجرای موازی کارها تا سقف این مقدار. اگر مقدار محاسبه‌شده کمتر از ۱ باشد، مقدار ۱ استفاده خواهد شد. همچنین ببینید: --use-cpus-instead-of-cores.
ضرب کردن N% در تعداد هسته‌های CPU. اجرای موازی کارها تا سقف این مقدار. اگر مقدار محاسبه‌شده کمتر از ۱ باشد، مقدار ۱ استفاده خواهد شد. همچنین ببینید: --use-cpus-instead-of-cores.
خواندن پارامتر از فایل. استفاده از محتوای procfile به عنوان پارامتر برای -j. برای مثال، procfile می‌تواند حاوی رشتهٔ 100% یا +2 یا 10 باشد.
ارسال stdin (ورودی استاندارد) به command.

اگر command از stdin (ورودی استاندارد) می‌خواند، از --pipe استفاده کنید.

استفاده از name به عنوان نام سمافور (semaphore). مقدار پیش‌فرض، نام tty کنترل‌کننده (خروجی دستور tty) است.

حالت پیش‌فرض معمولاً در استفادهٔ تعاملی طبق انتظار کار می‌کند، اما هنگام استفاده در یک اسکریپت، مقدار name باید تعیین شود. $$ یا my_task_name معمولاً مقادیر مناسبی هستند.

سمافور در ~/.parallel/semaphores/ ذخیره می‌شود.

در تمثیل دستشویی، این نام با انواع مختلف دستشویی متناظر است؛ مانند: آقایان، بانوان، مشتریان، کارکنان.

دستور در پس‌زمینه قرار نگیرد (در پیش‌زمینه اجرا شود).

در تمثیل دستشویی: GNU sem منتظر خالی شدن یک دستشویی می‌ماند، شخص را به دستشویی هدایت می‌کند، منتظر پایان کار او می‌ماند و سپس خارج می‌شود.

اگر secs > 0: چنانچه سمافور ظرف مدت secs ثانیه آزاد نشود، در هر صورت آن را تصاحب کن.

اگر secs < 0: چنانچه سمافور ظرف مدت secs ثانیه آزاد نشود، خارج شو.

در تمثیل دستشویی: اگر secs > 0: اگر ظرف مدت secs ثانیه هیچ دستشویی خالی نشود، روی زمین ادرار کن. اگر secs < 0: اگر ظرف مدت secs ثانیه هیچ دستشویی خالی نشود، بدون انجام هیچ کاری خارج شو.

منتظر ماندن برای اتمام اجرای تمام دستورها.

در تمثیل دستشویی: تا زمانی که همهٔ دستشویی‌ها خالی شوند منتظر بمان، سپس خارج شو..SH "درک سمافور (UNDERSTANDING A SEMAPHORE)" مثال زیر را امتحان کنید:

sem -j 2 'sleep 1;echo 1 finished';   echo sem 1 exited
sem -j 2 'sleep 2;echo 2 finished';   echo sem 2 exited
sem -j 2 'sleep 3;echo 3 finished';   echo sem 3 exited
sem -j 2 'sleep 4;echo 4 finished';   echo sem 4 exited
sem --wait; echo sem --wait done

در تمثیل توالت، این دستور از ۲ توالت (-j 2) استفاده می‌کند. دستور GNU sem پردازهٔ '1' را به یک توالت می‌برد و بلافاصله خارج می‌شود. در حالی که '1' در حال خواب است، یک GNU sem دیگر '2' را به یک توالت می‌برد و بلافاصله خارج می‌شود.

در حالی که '1' و '2' در حال خواب هستند، یک GNU sem دیگر منتظر یک توالت خالی می‌ماند. هنگامی که کار '1' تمام می‌شود، یک توالت آزاد می‌گردد و این GNU sem از انتظار دست کشیده، '3' را به یک توالت می‌برد و بلافاصله خارج می‌شود.

در حالی که '2' و '3' در حال خواب هستند، یک GNU sem دیگر منتظر یک توالت خالی می‌ماند. هنگامی که کار '2' تمام می‌شود، یک توالت آزاد می‌گردد و این GNU sem از انتظار دست کشیده، '4' را به یک توالت می‌برد و بلافاصله خارج می‌شود.

در نهایت، یک GNU sem دیگر منتظر می‌ماند تا تمام توالت‌ها آزاد شوند.

اجرای یک پردازهٔ gzip به ازای هر هستهٔ پردازنده (CPU). تا زمان آزاد شدن یک هستهٔ CPU مسدود می‌شود (صبر می‌کند).

for i in *.log ; do
  echo $i
  sem -j+0 gzip $i ";" echo done
done
sem --wait

دستور pod2html دو فایل به نام‌های pod2htmd.tmp و pod2htmi.tmp ایجاد می‌کند که آن‌ها را پاک‌سازی نمی‌کند. این برنامه برای مدت کوتاهی از این دو فایل استفاده می‌کند. اما اگر چندین pod2html را به‌صورت موازی اجرا کنید (برای مثال در یک Makefile با make -j)، این خطر وجود دارد که دو نمونهٔ مختلف از pod2html به‌طور هم‌زمان در این فایل‌ها بنویسند:

# This may fail due to shared pod2htmd.tmp/pod2htmi.tmp files
foo.html:
        pod2html foo.pod --outfile foo.html
bar.html:
        pod2html bar.pod --outfile bar.html
$ make -j foo.html bar.html

شما باید از اجرای هم‌زمان دو نمونه از pod2html جلوگیری کنید. اجرای sem به‌عنوان یک قفل متقابل (mutex) تضمین می‌کند که در هر لحظه تنها یک نمونه اجرا می‌شود:

foo.html:
        sem --id pod2html pod2html foo.pod --outfile foo.html
bar.html:
        sem --id pod2html pod2html bar.pod --outfile bar.html
clean: foo.html bar.html
        sem --id pod2html --wait
        rm -f pod2htmd.tmp pod2htmi.tmp
$ make -j foo.html bar.html clean

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

باگ‌ها را به <bug-parallel@gnu.org> گزارش دهید..SH "نویسنده (AUTHOR)" حق نشر (C) 2010-2026 متعلق است به Ole Tange، http://ole.tange.dk و Free Software Foundation, Inc.

این برنامه یک نرم‌افزار آزاد است؛ شما می‌توانید آن را تحت شرایط «پروانه عمومی همگانی گنو» (GNU General Public License) همان‌طور که توسط بنیاد نرم‌افزار آزاد منتشر شده است، چه نسخهٔ ۳ پروانه یا (به انتخاب خودتان) هر نسخهٔ بالاتر دیگری، بازتوزیع کرده و/یا تغییر دهید.

این برنامه با این امید توزیع شده است که مفید باشد، اما بدون هیچ‌گونه ضمانتی؛ حتی بدون ضمانت ضمنی قابل فروش بودن یا مناسب بودن برای یک هدف خاص. برای جزئیات بیشتر به پروانه عمومی همگانی گنو مراجعه کنید.

شما باید به همراه این برنامه نسخه‌ای از پروانه عمومی همگانی گنو را دریافت کرده باشید. در غیر این صورت، https://www.gnu.org/licenses را ببینید.

مجوز رونوشت‌برداری، توزیع و/یا تغییر این مستندات تحت شرایط «پروانه مستندات آزاد گنو» (GNU Free Documentation License)، نسخهٔ ۱.۳ یا هر نسخهٔ بالاتر منتشر شده توسط بنیاد نرم‌افزار آزاد؛ بدون بخش‌های تغییرناپذیر، بدون متون روی جلد و بدون متون پشت جلد اعطا می‌شود. نسخه‌ای از این پروانه در فایل LICENSES/GFDL-1.3-or-later.txt گنجانده شده است.

شما آزاد هستید:

به‌اشتراک‌گذاری (to Share)
برای رونوشت‌برداری، توزیع و انتقال اثر
بازآفرینی (to Remix)
برای تطبیق و بازآفرینی اثر

تحت شرایط زیر:

انتساب (Attribution)
باید اثر را به شیوه‌ای که توسط نویسنده یا اعطاکنندهٔ پروانه مشخص شده است منتسب کنید (اما نه به هیچ‌گونه‌ای که القا کند آن‌ها شما یا نحوهٔ استفادهٔ شما از اثر را تأیید می‌کنند).
اشتراک یکسان (Share Alike)
اگر در این اثر تغییری ایجاد کنید، آن را تبدیل نمایید یا اثری بر پایهٔ آن بسازید، تنها مجاز هستید اثر حاصل را تحت همان پروانه، پروانه‌ای مشابه یا سازگار توزیع کنید.

با این درک که:

صرف‌نظر (Waiver)
در صورت کسب اجازه از دارندهٔ حق نشر، می‌توان از هر یک از شرایط فوق صرف‌نظر کرد.
مالکیت عمومی (Public Domain)
در مواردی که اثر یا هر یک از اجزای آن بر اساس قانون حاکم در مالکیت عمومی باشد، این وضعیت به هیچ وجه تحت تأثیر پروانه قرار نمی‌گیرد.
سایر حقوق (Other Rights)
هیچ‌یک از حقوق زیر به هیچ وجه تحت تأثیر این پروانه قرار نمی‌گیرند:
  • حقوق معامله منصفانه یا استفاده منصفانهٔ شما، یا سایر استثناها و محدودیت‌های قانونی قابل اعمال بر حق نشر؛
  • حقوق معنوی نویسنده؛
  • حقوقی که سایر اشخاص ممکن است در خود اثر یا نحوهٔ استفاده از آن داشته باشند، از قبیل حقوق تبلیغات یا حریم خصوصی.
اعلامیه (Notice)
برای هرگونه استفادهٔ مجدد یا بازتوزیع، باید شرایط پروانهٔ این اثر را برای دیگران روشن کنید.

نسخه‌ای از متن کامل پروانه در فایل LICENCES/CC-BY-SA-4.0.txt قرار گرفته است.

ابزار GNU sem از Perl و ماژول‌های پرل Getopt::Long، Symbol و Fcntl استفاده می‌کند..SH "همچنین ببینید (SEE ALSO)" parallel(1)

2026-07-25 20260722