.\" -*- mode: troff; coding: utf-8 -*- .\" Automatically generated by Pod::Man v6.0.2 (Pod::Simple 3.45) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>. .ie n \{\ . ds C` "" . ds C' "" 'br\} .el\{\ . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Required to disable full justification in groff 1.23.0. .if n .ds AD l .\" ======================================================================== .\" .IX Title "SEM 1" .TH SEM 1 2026-07-25 20260722 parallel .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "نام (NAME)" sem \- سمافور برای اجرای موازی خطوط فرمان در شل .SH "خلاصه دستور (SYNOPSIS)" .IX Header "SYNOPSIS" \&\fBsem\fR [\-\-fg] [\-\-id ] [\-\-semaphore\-timeout ] [\-j ] [\-\-wait] command .SH "توضیحات (DESCRIPTION)" .IX Header "DESCRIPTION" ابزار GNU \fBsem\fR یک نام مستعار برای GNU \fBparallel \-\-semaphore\fR است. .PP ابزار GNU \fBsem\fR مانند یک سمافور شمارشی عمل می‌کند. زمانی که GNU \fBsem\fR به همراه یک دستور فراخوانی شود، آن دستور را در پس‌زمینه اجرا می‌کند. هنگامی که تعداد \fInum\fR دستور در پس‌زمینه در حال اجرا باشند، GNU \fBsem\fR پیش از شروع دستور جدید منتظر می‌ماند تا یکی از آن‌ها به پایان برسد. .PP ابزار GNU \fBsem\fR هیچ آرگومانی را برای ساختن دستور نمی‌خواند (فاقد \-a، ::: و ::::). این ابزار صرفاً منتظر در دسترس قرار گرفتن یک سمافور می‌ماند و سپس دستور داده‌شده را اجرا می‌کند. .PP پیش از بررسی گزینه‌ها، شاید مایل باشید مثال‌های پس از فهرست گزینه‌ها را بررسی کنید. این کار دید مناسبی از قابلیت‌های GNU \&\fBsem\fR به شما خواهد داد..SH "گزینه‌ها (OPTIONS)" .IX Header "OPTIONS" .IP \fIcommand\fR 9 .IX Item "command" دستوری که باید اجرا شود. پس از دستور می‌تواند آرگومان‌های آن قرار گیرد. .IP \fB\-\-bg\fR 9 .IX Item "--bg" اجرای دستور در پس‌زمینه؛ بنابراین GNU \fBsem\fR پیش از خروج، منتظر تکمیل دستور نخواهد ماند. این حالت پیش‌فرض است. .Sp در تمثیل دستشویی: GNU \fBsem\fR منتظر خالی شدن یک دستشویی می‌ماند، آن را به یک شخص می‌سپارد و بلافاصله خارج می‌شود. .Sp همچنین ببینید: \fB\-\-fg\fR .IP "\fB\-\-jobs\fR \fIN\fR" 9 .IX Item "--jobs N" .PD 0 .IP "\fB\-j\fR \fIN\fR" 9 .IX Item "-j N" .IP "\fB\-\-max\-procs\fR \fIN\fR" 9 .IX Item "--max-procs N" .IP "\fB\-P\fR \fIN\fR" 9 .IX Item "-P N" .PD اجرای حداکثر N دستور به صورت موازی. مقدار پیش‌فرض 1 است که همانند یک mutex (قفل متقابل) عمل می‌کند. .Sp در تمثیل دستشویی: \fB\-j\fR تعداد دستشویی‌ها است. .IP "\fB\-\-jobs\fR \fI+N\fR" 9 .IX Item "--jobs +N" .PD 0 .IP "\fB\-j\fR \fI+N\fR" 9 .IX Item "-j +N" .IP "\fB\-\-max\-procs\fR \fI+N\fR" 9 .IX Item "--max-procs +N" .IP "\fB\-P\fR \fI+N\fR" 9 .IX Item "-P +N" .PD افزودن N به تعداد هسته‌های CPU. اجرای موازی کارها تا سقف این مقدار. برای کارهای با بار پردازشی سنگین، \fB\-j\fR +0 مفید است، چرا که دقیقاً به تعداد هسته‌های پردازنده کارها را هم‌زمان اجرا می‌کند. .IP "\fB\-\-jobs\fR \fI\-N\fR" 9 .IX Item "--jobs -N" .PD 0 .IP "\fB\-j\fR \fI\-N\fR" 9 .IX Item "-j -N" .IP "\fB\-\-max\-procs\fR \fI\-N\fR" 9 .IX Item "--max-procs -N" .IP "\fB\-P\fR \fI\-N\fR" 9 .IX Item "-P -N" .PD کسر کردن N از تعداد هسته‌های CPU. اجرای موازی کارها تا سقف این مقدار. اگر مقدار محاسبه‌شده کمتر از ۱ باشد، مقدار ۱ استفاده خواهد شد. همچنین ببینید: \fB\-\-use\-cpus\-instead\-of\-cores\fR. .IP "\fB\-\-jobs\fR \fIN\fR%" 9 .IX Item "--jobs N%" .PD 0 .IP "\fB\-j\fR \fIN\fR%" 9 .IX Item "-j N%" .IP "\fB\-\-max\-procs\fR \fIN\fR%" 9 .IX Item "--max-procs N%" .IP "\fB\-P\fR \fIN\fR%" 9 .IX Item "-P N%" .PD ضرب کردن N% در تعداد هسته‌های CPU. اجرای موازی کارها تا سقف این مقدار. اگر مقدار محاسبه‌شده کمتر از ۱ باشد، مقدار ۱ استفاده خواهد شد. همچنین ببینید: \fB\-\-use\-cpus\-instead\-of\-cores\fR. .IP "\fB\-\-jobs\fR \fIprocfile\fR" 9 .IX Item "--jobs procfile" .PD 0 .IP "\fB\-j\fR \fIprocfile\fR" 9 .IX Item "-j procfile" .IP "\fB\-\-max\-procs\fR \fIprocfile\fR" 9 .IX Item "--max-procs procfile" .IP "\fB\-P\fR \fIprocfile\fR" 9 .IX Item "-P procfile" .PD خواندن پارامتر از فایل. استفاده از محتوای \fIprocfile\fR به عنوان پارامتر برای \fI\-j\fR. برای مثال، \fIprocfile\fR می‌تواند حاوی رشتهٔ 100% یا +2 یا 10 باشد. .IP \fB\-\-pipe\fR 9 .IX Item "--pipe" ارسال stdin (ورودی استاندارد) به \fIcommand\fR. .Sp اگر \fIcommand\fR از stdin (ورودی استاندارد) می‌خواند، از \fB\-\-pipe\fR استفاده کنید. .IP "\fB\-\-semaphore\-name\fR \fIname\fR" 9 .IX Item "--semaphore-name name" .PD 0 .IP "\fB\-\-id\fR \fIname\fR" 9 .IX Item "--id name" .PD استفاده از \fBname\fR به عنوان نام سمافور (semaphore). مقدار پیش‌فرض، نام tty کنترل‌کننده (خروجی دستور \fBtty\fR) است. .Sp حالت پیش‌فرض معمولاً در استفادهٔ تعاملی طبق انتظار کار می‌کند، اما هنگام استفاده در یک اسکریپت، مقدار \fIname\fR باید تعیین شود. \fI$$\fR یا \fImy_task_name\fR معمولاً مقادیر مناسبی هستند. .Sp سمافور در ~/.parallel/semaphores/ ذخیره می‌شود. .Sp در تمثیل دستشویی، این نام با انواع مختلف دستشویی متناظر است؛ مانند: آقایان، بانوان، مشتریان، کارکنان. .IP \fB\-\-fg\fR 9 .IX Item "--fg" دستور در پس‌زمینه قرار نگیرد (در پیش‌زمینه اجرا شود). .Sp در تمثیل دستشویی: GNU \fBsem\fR منتظر خالی شدن یک دستشویی می‌ماند، شخص را به دستشویی هدایت می‌کند، منتظر پایان کار او می‌ماند و سپس خارج می‌شود. .IP "\fB\-\-semaphore\-timeout\fR \fIsecs\fR" 9 .IX Item "--semaphore-timeout secs" .PD 0 .IP "\fB\-\-st\fR \fIsecs\fR" 9 .IX Item "--st secs" .PD اگر \fIsecs\fR > 0: چنانچه سمافور ظرف مدت \fIsecs\fR ثانیه آزاد نشود، در هر صورت آن را تصاحب کن. .Sp اگر \fIsecs\fR < 0: چنانچه سمافور ظرف مدت \fIsecs\fR ثانیه آزاد نشود، خارج شو. .Sp در تمثیل دستشویی: اگر \fIsecs\fR > 0: اگر ظرف مدت \&\fIsecs\fR ثانیه هیچ دستشویی خالی نشود، روی زمین ادرار کن. اگر \fIsecs\fR < 0: اگر ظرف مدت \fIsecs\fR ثانیه هیچ دستشویی خالی نشود، بدون انجام هیچ کاری خارج شو. .IP \fB\-\-wait\fR 9 .IX Item "--wait" منتظر ماندن برای اتمام اجرای تمام دستورها. .Sp در تمثیل دستشویی: تا زمانی که همهٔ دستشویی‌ها خالی شوند منتظر بمان، سپس خارج شو..SH "درک سمافور (UNDERSTANDING A SEMAPHORE)" .IX Header "UNDERSTANDING A SEMAPHORE" مثال زیر را امتحان کنید: .PP .Vb 5 \& sem \-j 2 \*(Aqsleep 1;echo 1 finished\*(Aq; echo sem 1 exited \& sem \-j 2 \*(Aqsleep 2;echo 2 finished\*(Aq; echo sem 2 exited \& sem \-j 2 \*(Aqsleep 3;echo 3 finished\*(Aq; echo sem 3 exited \& sem \-j 2 \*(Aqsleep 4;echo 4 finished\*(Aq; echo sem 4 exited \& sem \-\-wait; echo sem \-\-wait done .Ve .PP در تمثیل توالت، این دستور از ۲ توالت (\fB\-j 2\fR) استفاده می‌کند. دستور GNU \fBsem\fR پردازهٔ \*(Aq1\*(Aq را به یک توالت می‌برد و بلافاصله خارج می‌شود. در حالی که \*(Aq1\*(Aq در حال خواب است، یک GNU \fBsem\fR دیگر \*(Aq2\*(Aq را به یک توالت می‌برد و بلافاصله خارج می‌شود. .PP در حالی که \*(Aq1\*(Aq و \*(Aq2\*(Aq در حال خواب هستند، یک GNU \fBsem\fR دیگر منتظر یک توالت خالی می‌ماند. هنگامی که کار \*(Aq1\*(Aq تمام می‌شود، یک توالت آزاد می‌گردد و این GNU \fBsem\fR از انتظار دست کشیده، \*(Aq3\*(Aq را به یک توالت می‌برد و بلافاصله خارج می‌شود. .PP در حالی که \*(Aq2\*(Aq و \*(Aq3\*(Aq در حال خواب هستند، یک GNU \fBsem\fR دیگر منتظر یک توالت خالی می‌ماند. هنگامی که کار \*(Aq2\*(Aq تمام می‌شود، یک توالت آزاد می‌گردد و این GNU \fBsem\fR از انتظار دست کشیده، \*(Aq4\*(Aq را به یک توالت می‌برد و بلافاصله خارج می‌شود. .PP در نهایت، یک GNU \fBsem\fR دیگر منتظر می‌ماند تا تمام توالت‌ها آزاد شوند. .SH "مثال: فشرده‌سازی log.* با Gzip (EXAMPLE: Gzipping *.log)" .IX Header "EXAMPLE: Gzipping *.log" اجرای یک پردازهٔ gzip به ازای هر هستهٔ پردازنده (CPU). تا زمان آزاد شدن یک هستهٔ CPU مسدود می‌شود (صبر می‌کند). .PP .Vb 5 \& for i in *.log ; do \& echo $i \& sem \-j+0 gzip $i ";" echo done \& done \& sem \-\-wait .Ve .SH "مثال: محافظت از pod2html در برابر خودش (EXAMPLE: Protecting pod2html from itself)" .IX Header "EXAMPLE: Protecting pod2html from itself" دستور pod2html دو فایل به نام‌های pod2htmd.tmp و pod2htmi.tmp ایجاد می‌کند که آن‌ها را پاک‌سازی نمی‌کند. این برنامه برای مدت کوتاهی از این دو فایل استفاده می‌کند. اما اگر چندین pod2html را به‌صورت موازی اجرا کنید (برای مثال در یک Makefile با make \-j)، این خطر وجود دارد که دو نمونهٔ مختلف از pod2html به‌طور هم‌زمان در این فایل‌ها بنویسند: .PP .Vb 3 \& # 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 .Ve .PP شما باید از اجرای هم‌زمان دو نمونه از pod2html جلوگیری کنید. اجرای \fBsem\fR به‌عنوان یک قفل متقابل (mutex) تضمین می‌کند که در هر لحظه تنها یک نمونه اجرا می‌شود: .PP .Vb 2 \& 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 .Ve .SH "اشکالات (BUGS)" .IX Header "BUGS" هیچ مورد شناخته‌شده‌ای وجود ندارد. .SH "گزارش باگ‌ها (REPORTING BUGS)" .IX Header "REPORTING BUGS" باگ‌ها را به گزارش دهید..SH "نویسنده (AUTHOR)" .IX Header "AUTHOR" حق نشر (C) 2010\-2026 متعلق است به Ole Tange، http://ole.tange.dk و Free Software Foundation, Inc. .SH "مجوز (LICENSE)" .IX Header "LICENSE" این برنامه یک نرم‌افزار آزاد است؛ شما می‌توانید آن را تحت شرایط «پروانه عمومی همگانی گنو» (GNU General Public License) همان‌طور که توسط بنیاد نرم‌افزار آزاد منتشر شده است، چه نسخهٔ ۳ پروانه یا (به انتخاب خودتان) هر نسخهٔ بالاتر دیگری، بازتوزیع کرده و/یا تغییر دهید. .PP این برنامه با این امید توزیع شده است که مفید باشد، اما بدون هیچ‌گونه ضمانتی؛ حتی بدون ضمانت ضمنی قابل فروش بودن یا مناسب بودن برای یک هدف خاص. برای جزئیات بیشتر به پروانه عمومی همگانی گنو مراجعه کنید. .PP شما باید به همراه این برنامه نسخه‌ای از پروانه عمومی همگانی گنو را دریافت کرده باشید. در غیر این صورت، را ببینید. .SS "مجوز مستندات ۱ (Documentation license I)" .IX Subsection "Documentation license I" مجوز رونوشت‌برداری، توزیع و/یا تغییر این مستندات تحت شرایط «پروانه مستندات آزاد گنو» (GNU Free Documentation License)، نسخهٔ ۱.۳ یا هر نسخهٔ بالاتر منتشر شده توسط بنیاد نرم‌افزار آزاد؛ بدون بخش‌های تغییرناپذیر، بدون متون روی جلد و بدون متون پشت جلد اعطا می‌شود. نسخه‌ای از این پروانه در فایل LICENSES/GFDL\-1.3\-or\-later.txt گنجانده شده است. .SS "مجوز مستندات ۲ (Documentation license II)" .IX Subsection "Documentation license II" شما آزاد هستید: .IP "\fBبه‌اشتراک‌گذاری (to Share)\fR" 9 .IX Item "to Share" برای رونوشت‌برداری، توزیع و انتقال اثر .IP "\fBبازآفرینی (to Remix)\fR" 9 .IX Item "to Remix" برای تطبیق و بازآفرینی اثر .PP تحت شرایط زیر: .IP "\fBانتساب (Attribution)\fR" 9 .IX Item "Attribution" باید اثر را به شیوه‌ای که توسط نویسنده یا اعطاکنندهٔ پروانه مشخص شده است منتسب کنید (اما نه به هیچ‌گونه‌ای که القا کند آن‌ها شما یا نحوهٔ استفادهٔ شما از اثر را تأیید می‌کنند). .IP "\fBاشتراک یکسان (Share Alike)\fR" 9 .IX Item "Share Alike" اگر در این اثر تغییری ایجاد کنید، آن را تبدیل نمایید یا اثری بر پایهٔ آن بسازید، تنها مجاز هستید اثر حاصل را تحت همان پروانه، پروانه‌ای مشابه یا سازگار توزیع کنید. .PP با این درک که: .IP "\fBصرف‌نظر (Waiver)\fR" 9 .IX Item "Waiver" در صورت کسب اجازه از دارندهٔ حق نشر، می‌توان از هر یک از شرایط فوق صرف‌نظر کرد. .IP "\fBمالکیت عمومی (Public Domain)\fR" 9 .IX Item "Public Domain" در مواردی که اثر یا هر یک از اجزای آن بر اساس قانون حاکم در مالکیت عمومی باشد، این وضعیت به هیچ وجه تحت تأثیر پروانه قرار نمی‌گیرد. .IP "\fBسایر حقوق (Other Rights)\fR" 9 .IX Item "Other Rights" هیچ‌یک از حقوق زیر به هیچ وجه تحت تأثیر این پروانه قرار نمی‌گیرند: .RS 9 .IP \(bu 2 حقوق معامله منصفانه یا استفاده منصفانهٔ شما، یا سایر استثناها و محدودیت‌های قانونی قابل اعمال بر حق نشر؛ .IP \(bu 2 حقوق معنوی نویسنده؛ .IP \(bu 2 حقوقی که سایر اشخاص ممکن است در خود اثر یا نحوهٔ استفاده از آن داشته باشند، از قبیل حقوق تبلیغات یا حریم خصوصی. .RE .RS 9 .RE .IP "\fBاعلامیه (Notice)\fR" 9 .IX Item "Notice" برای هرگونه استفادهٔ مجدد یا بازتوزیع، باید شرایط پروانهٔ این اثر را برای دیگران روشن کنید. .PP نسخه‌ای از متن کامل پروانه در فایل LICENCES/CC\-BY\-SA\-4.0.txt قرار گرفته است. .SH "وابستگی‌ها (DEPENDENCIES)" .IX Header "DEPENDENCIES" ابزار GNU \fBsem\fR از Perl و ماژول‌های پرل Getopt::Long، Symbol و Fcntl استفاده می‌کند..SH "همچنین ببینید (SEE ALSO)" .IX Header "SEE ALSO" \&\fBparallel\fR(1)