.\" -*- 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 "PARALLEL 1" .TH PARALLEL 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)" parallel \- ساخت و اجرای خطوط دستور شل از ورودی استاندارد به‌صورت موازی .SH "خلاصه دستور (SYNOPSIS)" .IX Header "SYNOPSIS" \&\fBparallel\fR [گزینه‌ها] [\fIcommand\fR [\fIarguments\fR]] < list_of_arguments .PP \&\fBparallel\fR [گزینه‌ها] [\fIcommand\fR [\fIarguments\fR]] ( \fB:::\fR arguments | \&\fB:::+\fR arguments | \fB::::\fR argfile(s) | \fB::::+\fR argfile(s) ) ... .PP \&\fBparallel\fR \-\-semaphore [گزینه‌ها] \fIcommand\fR .PP \&\fB#!/usr/bin/parallel\fR \-\-shebang [گزینه‌ها] [\fIcommand\fR [\fIarguments\fR]] .PP \&\fB#!/usr/bin/parallel\fR \-\-shebang\-wrap [گزینه‌ها] [\fIcommand\fR [\fIarguments\fR]] .SH "توضیحات (DESCRIPTION)" .IX Header "DESCRIPTION" توقف! .PP اگر به تازگی کار با GNU \fBparallel\fR را آغاز کرده‌اید، بخش \fBراهنمای خواننده\fR در ادامه را مطالعه کنید. .PP ابزار GNU \fBparallel\fR یک ابزار شل برای اجرای موازی کارها (jobs) با استفاده از یک یا چند رایانه است. یک کار می‌تواند یک دستور منفرد یا یک اسکریپت کوچک باشد که باید برای هر یک از خطوط ورودی اجرا شود. ورودی معمولاً فهرستی از فایل‌ها، میزبان‌ها (hosts)، کاربران، نشانی‌های وب (URLs) یا جدولی از داده‌ها است. یک کار همچنین می‌تواند دستوری باشد که از یک پایپ (pipe) ورودی می‌خواند؛ در این حالت GNU \fBparallel\fR می‌تواند ورودی را به بلوک‌هایی تقسیم کرده و هر بلوک را به‌طور موازی به دستور پایپ کند. .PP اگر امروزه از xargs و tee استفاده می‌کنید، کار با GNU \fBparallel\fR را بسیار آسان خواهید یافت چرا که به گونه‌ای نوشته شده است که گزینه‌های مشابه xargs داشته باشد. اگر در شل حلقه می‌نویسید، GNU \fBparallel\fR می‌تواند جایگزین بیشتر حلقه‌ها شود و با اجرای هم‌زمان چندین کار به‌صورت موازی، سرعت اجرای آن‌ها را افزایش دهد. .PP ابزار GNU \fBparallel\fR تضمین می‌کند که خروجی حاصل از دستورات دقیقاً همان خروجی باشد که در صورت اجرای ترتیبی به دست می‌آوردید. این ویژگی استفاده از خروجی GNU \fBparallel\fR را به‌عنوان ورودی سایر برنامه‌ها ممکن می‌سازد. .PP به ازای هر خط از ورودی، GNU \fBparallel\fR دستور \fIcommand\fR را با آن خط به‌عنوان آرگومان اجرا می‌کند. اگر هیچ \fIcommand\fR مشخص نشده باشد، خود خط ورودی اجرا می‌شود. چندین خط به‌طور همزمان اجرا خواهند شد. GNU \fBparallel\fR اغلب می‌تواند به‌عنوان جایگزینی برای \fBxargs\fR یا \fBcat | bash\fR استفاده شود. .SS "راهنمای خواننده (Reader\*(Aqs guide)" .IX Subsection "Reader's guide" مستندات GNU \fBparallel\fR شامل ۴ نوع است: آموزش گام‌به‌گام (Tutorial)، راهنمای کاربردی (how\-to)، مرجع کامل (reference) و توضیحات/طراحی (explanation/design). .PP \fIآموزش گام‌به‌گام (Tutorial)\fR .IX Subsection "Tutorial" .PP اگر خواندن کتاب را ترجیح می‌دهید، کتاب \fBGNU Parallel 2018\fR را از https://www.lulu.com/shop/ole\-tange/gnu\-parallel\-2018/paperback/product\-23558902.html خریداری کنید یا آن را از نشانی https://doi.org/10.5281/zenodo.1146014 بارگیری نمایید. حداقل فصل‌های ۱ و ۲ را بخوانید؛ کمتر از ۲۰ دقیقه زمان خواهد برد. .PP در غیر این صورت، برای یک معرفی سریع با تماشای ویدیوهای آموزشی شروع کنید: https://youtube.com/playlist?list=PL284C9FF2488BC6D1 .PP اگر می‌خواهید عمیق‌تر شوید: یکی دو ساعت را صرف مرور آموزش کامل کنید (\fBman parallel_tutorial\fR). خط فرمان شما بابت این کار از شما قدردانی خواهد کرد! .PP \fIراهنمای کاربردی (How\-to)\fR .IX Subsection "How-to" .PP می‌توانید مثال‌های متعددی از نحوه استفاده را در \fBman parallel_examples\fR بیابید. این مثال‌ها درک خوبی از قابلیت‌های GNU \fBparallel\fR به شما می‌دهند و ممکن است راه‌حلی پیدا کنید که بتوانید آن را مستقیماً برای نیاز خود تطبیق دهید. .PP اگر مثال‌ها نیاز دقیق شما را پوشش نمی‌دهند، نقشه گزینه‌ها (https://www.gnu.org/software/parallel/parallel_options_map.pdf) می‌تواند به شما در شناسایی گزینه‌های مرتبط کمک کند تا بتوانید آن‌ها را در صفحه راهنما جستجو کنید. .PP \fIمرجع (Reference)\fR .IX Subsection "Reference" .PP اگر به یک برگه تقلب (cheat sheet) یک‌صفحه‌ای قابل چاپ نیاز دارید، می‌توانید آن را در نشانی زیر پیدا کنید: https://www.gnu.org/software/parallel/parallel_cheat.pdf .PP صفحه راهنما (man page) مرجع اصلی تمام گزینه‌هاست، و خواندن این صفحه از ابتدا تا انتها احتمالاً چیزی نیست که به آن نیاز داشته باشید. .PP \fIبحث و بررسی طراحی (Design discussion)\fR .IX Subsection "Design discussion" .PP اگر می‌خواهید از تصمیمات طراحی پشت GNU \fBparallel\fR آگاه شوید، دستور زیر را بررسی کنید: \&\fBman parallel_design\fR. این مورد همچنین مقدمه‌ای عالی است اگر قصد توسعه یا تغییر در کد GNU \fBparallel\fR را دارید. .SH "گزینه‌ها (OPTIONS)" .IX Header "OPTIONS" .IP \fIcommand\fR 4 .IX Item "command" دستور برای اجرا. .Sp اگر \fIcommand\fR یا آرگومان‌های بعدی شامل رشته‌های جایگزینی (مانند \fB{}\fR) باشند، هر مورد با ورودی جایگزین خواهد شد. .Sp اگر \fIcommand\fR مشخص شده باشد، GNU \fBparallel\fR همان وظایف \fBxargs\fR را انجام می‌دهد. اگر \fIcommand\fR داده نشود، GNU \fBparallel\fR رفتاری مشابه \fBcat | sh\fR خواهد داشت. .Sp مقدار \fIcommand\fR باید یک فایل اجرایی، یک اسکریپت، یک دستور ترکیبی، یک نام مستعار (alias) یا یک تابع باشد. .Sp \&\fBتوابع Bash\fR: ابتدا تابع را با \fBexport \-f\fR اکسپورت کنید یا از \fBenv_parallel\fR استفاده نمایید. .Sp \&\fBنام‌های مستعار Bash، Csh یا Tcsh\fR: از \fBenv_parallel\fR استفاده کنید. .Sp \&\fBتوابع و نام‌های مستعار Zsh، Fish، Ksh و Pdksh\fR: از \fBenv_parallel\fR استفاده کنید. .IP \fB{}\fR 4 .IX Item "{}" خط ورودی. .Sp این رشته جایگزینی با یک خط کامل خوانده‌شده از منبع ورودی جایگزین می‌شود. منبع ورودی معمولاً stdin (ورودی استاندارد) است، اما با \fB\-\-arg\-file\fR، \fB:::\fR یا \fB::::\fR نیز می‌تواند مشخص شود. .Sp رشته جایگزینی \fB{}\fR را می‌توان با \fB\-I\fR تغییر داد. .Sp اگر خط فرمان هیچ رشته جایگزینی نداشته باشد، \fB{}\fR به انتهای خط فرمان اضافه خواهد شد. .Sp رشته‌های جایگزینی معمولاً نقل‌قول (کوتیشن) می‌شوند تا کاراکترهای ویژه توسط شل پردازش نشوند. استثنا زمانی است که دستور با یک رشته جایگزینی شروع شود؛ در این صورت رشته کوتیشن نمی‌شود. .Sp همچنین ببینید: \fB\-\-plus\fR \fB{.}\fR \fB{/}\fR \fB{//}\fR \fB{/.}\fR \fB{#}\fR \fB{%}\fR \&\fB{\fR\fIn\fR\fB}\fR \fB{=\fR\fIperl expression\fR\fB=}\fR .IP \fB{.}\fR 4 .IX Item "{.}" خط ورودی بدون پسوند. .Sp این رشته جایگزینی با ورودی پس از حذف پسوند آن جایگزین می‌شود. اگر خط ورودی بعد از آخرین \fB/\fR حاوی \fB.\fR باشد، آخرین \fB.\fR تا انتهای رشته حذف شده و \fB{.}\fR با باقیمانده متن جایگزین می‌شود. برای مثال \fIfoo.jpg\fR تبدیل به \fIfoo\fR می‌شود، \fIsubdir/foo.jpg\fR به \fIsubdir/foo\fR، \fIsub.dir/foo.jpg\fR به \fIsub.dir/foo\fR، و \fIsub.dir/bar\fR بدون تغییر به‌صورت \fIsub.dir/bar\fR باقی می‌ماند. اگر خط ورودی شامل \fB.\fR نباشد، دست‌نخورده باقی می‌ماند. .Sp رشته جایگزینی \fB{.}\fR را می‌توان با \fB\-\-extensionreplace\fR تغییر داد. .Sp همچنین ببینید: \fB{}\fR \fB\-\-extensionreplace\fR .IP \fB{/}\fR 4 .IX Item "{/}" نام پایه (basename) خط ورودی. .Sp این رشته جایگزینی با ورودی پس از حذف بخش دایرکتوری جایگزین می‌شود. .Sp همچنین ببینید: \fB{}\fR \fB\-\-basenamereplace\fR .IP \fB{//}\fR 4 .IX Item "{//}" نام دایرکتوری (dirname) خط ورودی. .Sp این رشته جایگزینی با مسیر دایرکتوری خط ورودی جایگزین می‌شود. به \fBdirname\fR(1) مراجعه کنید. .Sp همچنین ببینید: \fB{}\fR \fB\-\-dirnamereplace\fR .IP \fB{/.}\fR 4 .IX Item "{/.}" نام پایه (basename) خط ورودی بدون پسوند. .Sp این رشته جایگزینی با ورودی پس از حذف هر دو بخش دایرکتوری و پسوند جایگزین می‌شود. \fB{/.}\fR ترکیبی از \fB{/}\fR و \fB{.}\fR است. .Sp همچنین ببینید: \fB{}\fR \fB\-\-basenameextensionreplace\fR .IP \fB{#}\fR 4 .IX Item "{#}" شماره ترتیبی کاری که باید اجرا شود. .Sp این رشته جایگزینی با شماره ترتیبی کار در حال اجرا جایگزین می‌شود. این مقدار معادل متغیر \f(CW$PARALLEL_SEQ\fR است. .Sp همچنین ببینید: \fB{}\fR \fB\-\-seqreplace\fR .IP "\fB{%}\fR (آزمایشی / alpha testing)" 4 .IX Item "{%} (alpha testing)" شماره اسلات (slot) کار. .Sp این رشته جایگزینی با شماره اسلات کار بین ۱ و تعداد کارهای قابل اجرا به‌صورت موازی جایگزین می‌شود. هیچ‌گاه ۲ کار به‌طور همزمان با یک شماره اسلات یکسان اجرا نخواهند شد. .Sp اگر نیاز به تلاش مجدد برای یک کار باشد (مثلاً با استفاده از \fB\-\-retries\fR یا \fB\-\-retry\-failed\fR)، شماره اسلات کار به‌طور خودکار به‌روزرسانی نمی‌شود. در این حالت باید در عوض از \fR\f(CB$PARALLEL_JOBSLOT\fR\fB\fR استفاده کنید: .Sp .Vb 10 \& $ do_test() { \& id="$3 {%}=$1 PARALLEL_JOBSLOT=$2" \& echo run "$id"; \& sleep 1 \& # fail if {%} is odd \& return \`echo $1%2 | bc\` \& } \& $ export \-f do_test \& $ parallel \-j3 \-\-jl mylog do_test {%} \e$PARALLEL_JOBSLOT {} ::: A B C D \& run A {%}=1 PARALLEL_JOBSLOT=1 \& run B {%}=2 PARALLEL_JOBSLOT=2 \& run C {%}=3 PARALLEL_JOBSLOT=3 \& run D {%}=1 PARALLEL_JOBSLOT=1 \& $ parallel \-\-retry\-failed \-j3 \-\-jl mylog do_test {%} \e$PARALLEL_JOBSLOT {} ::: A B C D \& run A {%}=1 PARALLEL_JOBSLOT=1 \& run C {%}=3 PARALLEL_JOBSLOT=2 \& run D {%}=1 PARALLEL_JOBSLOT=3 .Ve .Sp توجه کنید که چگونه {%} و \f(CW$PARALLEL_JOBSLOT\fR در اجرای مجدد C و D تفاوت دارند. .Sp همچنین ببینید: \fB{}\fR \fB\-\-jobs\fR \fB\-\-slotreplace\fR .IP \fB{\fR\fIn\fR\fB}\fR 4 .IX Item "{n}" آرگومان برگرفته از منبع ورودی \fIn\fR یا \fIn\fR\*(Aqمین آرگومان. .Sp این رشته جایگزینی موقعیتی با مقدار ورودی از منبع ورودی \fIn\fR (هنگام استفاده با \fB\-\-arg\-file\fR یا \fB::::\fR) یا با \fIn\fR\*(Aqمین آرگومان (هنگام استفاده با \fB\-N\fR یا \fB\-\-colsep\fR) جایگزین می‌شود. .Sp اگر \fIn\fR منفی باشد، به \fIn\fR\*(Aqمین آرگومان از انتها اشاره دارد. .Sp همچنین ببینید: \fB{}\fR \fB{\fR\fIn\fR.\fB}\fR \fB{\fR\fIn\fR/\fB}\fR \fB{\fR\fIn\fR//\fB}\fR \&\fB{\fR\fIn\fR/.\fB}\fR \fB\-\-colsep\fR .IP \fB{\fR\fIn\fR.\fB}\fR 4 .IX Item "{n.}" آرگومان برگرفته از منبع ورودی \fIn\fR یا \fIn\fR\*(Aqمین آرگومان بدون پسوند. .Sp \&\fB{\fR\fIn\fR.\fB}\fR ترکیبی از \fB{\fR\fIn\fR\fB}\fR و \fB{.}\fR است. .Sp این رشته جایگزینی موقعیتی با مقدار ورودی از منبع ورودی \fIn\fR (هنگام استفاده با \fB\-\-arg\-file\fR یا \fB::::\fR) یا با \fIn\fR\*(Aqمین آرگومان (هنگام استفاده با \fB\-N\fR) پس از حذف پسوند آن جایگزین می‌شود. .Sp همچنین ببینید: \fB{\fR\fIn\fR\fB}\fR \fB{.}\fR .IP \fB{\fR\fIn\fR/\fB}\fR 4 .IX Item "{n/}" نام پایه (basename) آرگومان برگرفته از منبع ورودی \fIn\fR یا \fIn\fR\*(Aqمین آرگومان. .Sp \&\fB{\fR\fIn\fR/\fB}\fR ترکیبی از \fB{\fR\fIn\fR\fB}\fR و \fB{/}\fR است. .Sp این رشته جایگزینی موقعیتی با مقدار ورودی از منبع ورودی \fIn\fR (هنگام استفاده با \fB\-\-arg\-file\fR یا \fB::::\fR) یا با \fIn\fR\*(Aqمین آرگومان (هنگام استفاده با \fB\-N\fR) پس از حذف بخش دایرکتوری (در صورت وجود) جایگزین می‌شود. .Sp همچنین ببینید: \fB{\fR\fIn\fR\fB}\fR \fB{/}\fR .IP \fB{\fR\fIn\fR//\fB}\fR 4 .IX Item "{n//}" نام دایرکتوری (dirname) آرگومان برگرفته از منبع ورودی \fIn\fR یا \fIn\fR\*(Aqمین آرگومان. .Sp \&\fB{\fR\fIn\fR//\fB}\fR ترکیبی از \fB{\fR\fIn\fR\fB}\fR و \fB{//}\fR است. .Sp این رشته جایگزینی موقعیتی با مسیر دایرکتوری ورودی از منبع ورودی \fIn\fR (هنگام استفاده با \fB\-\-arg\-file\fR یا \fB::::\fR) یا با \fIn\fR\*(Aqمین آرگومان (هنگام استفاده با \fB\-N\fR) جایگزین می‌شود. به \fBdirname\fR(1) مراجعه کنید. .Sp همچنین ببینید: \fB{\fR\fIn\fR\fB}\fR \fB{//}\fR .IP \fB{\fR\fIn\fR/.\fB}\fR 4 .IX Item "{n/.}" نام پایه (basename) آرگومان برگرفته از منبع ورودی \fIn\fR یا \fIn\fR\*(Aqمین آرگومان بدون پسوند. .Sp \&\fB{\fR\fIn\fR/.\fB}\fR ترکیبی از \fB{\fR\fIn\fR\fB}\fR، \fB{/}\fR و \fB{.}\fR است. .Sp این رشته جایگزینی موقعیتی با مقدار ورودی از منبع ورودی \fIn\fR (هنگام استفاده با \fB\-\-arg\-file\fR یا \fB::::\fR) یا با \fIn\fR\*(Aqمین آرگومان (هنگام استفاده با \fB\-N\fR) پس از حذف هر دو بخش دایرکتوری (در صورت وجود) و پسوند جایگزین می‌شود. .Sp همچنین ببینید: \fB{\fR\fIn\fR\fB}\fR \fB{/.}\fR .IP "\fB{=\fR\fIperl expression\fR\fB=}\fR" 4 .IX Item "{=perl expression=}" جایگزینی با مقدار محاسبه‌شده \fIperl expression\fR. .Sp متغیر \fR\f(CB$_\fR\fB\fR حاوی همان مقدار \fB{}\fR خواهد بود. پس از ارزیابی \fIperl expression\fR، مقدار \fR\f(CB$_\fR\fB\fR به‌عنوان مقدار جایگزین استفاده خواهد شد. توصیه می‌شود فقط \f(CW$_\fR را تغییر دهید، هرچند به تمامی توابع و ساختارهای داده داخلی GNU \fBparallel\fR دسترسی کامل دارید. .Sp عبارت باید در صورت دو بار ارزیابی شدن نتیجه یکسانی ارائه دهد \- در غیر این صورت رفتار نامشخص خواهد بود. به عنوان مثال در برخی از نسخه‌های GNU \fBparallel\fR این دستور طبق انتظار کار نخواهد کرد: .Sp .Vb 1 \& parallel echo \*(Aq{= $_= ++$wrong_counter =}\*(Aq ::: a b c .Ve .Sp چندین تابع و ساختار داده کمکی جهت سهولت استفاده در نظر گرفته شده است: .RS 4.IP " \fBQ(\fR\fIstring\fR\fB)\fR" 2 .IX Item " Q(string)" نقل‌قول کردن یک رشته برای پوسته (Shell quote). مثال: .Sp .Vb 1 \& parallel echo {} is quoted as \*(Aq{= $_=Q($_) =}\*(Aq ::: \e$PWD .Ve .IP " \fBpQ(\fR\fIstring\fR\fB)\fR" 2 .IX Item " pQ(string)" نقل‌قول کردن یک رشته برای پرل (Perl quote). مثال: .Sp .Vb 1 \& parallel echo {} is quoted as \*(Aq{= $_=pQ($_) =}\*(Aq ::: \e$PWD .Ve .IP " \fBuq()\fR (or \fBuq\fR)" 2 .IX Item " uq() (or uq)" رشته جایگزین فعلی را نقل‌قول نکن. مثال: .Sp .Vb 1 \& parallel echo {} has the value \*(Aq{= uq =}\*(Aq ::: \e$PWD .Ve .IP " \fBhash(val)\fR" 2 .IX Item " hash(val)" محاسبه \fBB::hash(val)\fR. مثال: .Sp .Vb 1 \& parallel echo Hash of {} is \*(Aq{= $_=hash($_) =}\*(Aq ::: a b c .Ve .IP " \fBtotal_jobs()\fR" 2 .IX Item " total_jobs()" تعداد کل کارها (jobs). مثال: .Sp .Vb 1 \& parallel echo Number of jobs: \*(Aq{= $_=total_jobs() =}\*(Aq ::: a b c .Ve .IP " \fBslot()\fR (alpha testing)" 2 .IX Item " slot() (alpha testing)" شماره اسلات (slot) کار. مثال: .Sp .Vb 1 \& parallel echo Job slot of {} is \*(Aq{= $_=slot() =}\*(Aq ::: a b c .Ve .IP " \fBseq()\fR" 2 .IX Item " seq()" شماره ترتیبی کار. مثال: .Sp .Vb 1 \& parallel echo Seq number of {} is \*(Aq{= $_=seq() =}\*(Aq ::: a b c .Ve .ie n .IP " \fR\fB@arg\fR\fB\fR" 2 .el .IP " \fR\f(CB@arg\fR\fB\fR" 2 .IX Item " @arg" آرگومان‌ها با شمارش از ۱ (\fB$arg[1] = {1}\fR = اولین آرگومان). مثال: .Sp .Vb 2 \& parallel echo {1}+{2}=\*(Aq{=1 $_=$arg[1]+$arg[2] =}\*(Aq \e \& ::: 1 2 3 ::: 2 3 4 .Ve .Sp (\*(Aq{=1\*(Aq این را مجبور به تبدیل شدن به یک رشته جایگزین مکانی می‌کند و بنابراین مقدار را برای هر آرگومان تکرار نخواهد کرد.) .IP " \fBskip()\fR (alpha testing)" 2 .IX Item " skip() (alpha testing)" رد کردن این کار (همچنین ببینید: \fB\-\-filter\fR). مثال: .Sp .Vb 2 \& parallel echo \*(Aq{= $arg[1] >= $arg[2] and skip =}\*(Aq \e \& ::: 1 2 3 ::: 2 3 4 .Ve .IP " \fByyyy_mm_dd_hh_mm_ss(sec)\fR" 2 .IX Item " yyyy_mm_dd_hh_mm_ss(sec)" .PD 0 .IP " \fByyyy_mm_dd_hh_mm(sec)\fR" 2 .IX Item " yyyy_mm_dd_hh_mm(sec)" .IP " \fByyyy_mm_dd(sec)\fR" 2 .IX Item " yyyy_mm_dd(sec)" .IP " \fBhh_mm_ss(sec)\fR" 2 .IX Item " hh_mm_ss(sec)" .IP " \fBhh_mm(sec)\fR" 2 .IX Item " hh_mm(sec)" .IP " \fByyyymmddhhmmss(sec)\fR" 2 .IX Item " yyyymmddhhmmss(sec)" .IP " \fByyyymmddhhmm(sec)\fR" 2 .IX Item " yyyymmddhhmm(sec)" .IP " \fByyyymmdd(sec)\fR" 2 .IX Item " yyyymmdd(sec)" .IP " \fBhhmmss(sec)\fR" 2 .IX Item " hhmmss(sec)" .IP " \fBhhmm(sec)\fR" 2 .IX Item " hhmm(sec)" .PD توابع زمان. \fIsec\fR تعداد ثانیه‌ها از مبدا زمان (epoch) است. در صورت حذف، از زمان محلی فعلی استفاده خواهد شد. مثال: .Sp .Vb 3 \& parallel echo \*(AqNow: {= $_=yyyy_mm_dd_hh_mm_ss() =}\*(Aq ::: Dummy \& parallel echo \*(AqThe end: {= $_=yyyy_mm_dd_hh_mm_ss($_) =}\*(Aq \e \& ::: 2147483648 .Ve .RE .RS 4 .Sp مثال: .Sp .Vb 3 \& seq 10 | parallel echo {} + 1 is {= \*(Aq$_++\*(Aq =} \& parallel csh \-c {= \*(Aq$_="mkdir ".Q($_)\*(Aq =} ::: \*(Aq12" dir\*(Aq \& seq 50 | parallel echo job {#} of {= \*(Aq$_=total_jobs()\*(Aq =} .Ve .Sp همچنین ببینید: \fB\-\-rpl\fR \fB\-\-parens\fR \fB{}\fR \fB{=\fR\fIn\fR \fIperl expression\fR\fB=}\fR \&\fB\-\-filter\fR .RE .IP "\fB{=\fR\fIn\fR \fIperl expression\fR\fB=}\fR" 4 .IX Item "{=n perl expression=}" معادل مکانی برای \fB{=\fR\fIperl expression\fR\fB=}\fR. .Sp برای درک رشته‌های جایگزین مکانی، \fB{\fR\fIn\fR\fB}\fR را ببینید. .Sp همچنین ببینید: \fB{=\fR\fIperl expression\fR\fB=}\fR \fB{\fR\fIn\fR\fB}\fR .IP \fB{\fR\fIrpl\fR:\fIformat\fR\fB}\fR 4 .IX Item "{rpl:format}" قالب‌بندی رشته جایگزین. .Sp از \fIformat\fR برای قالب‌بندی \fIrpl\fR استفاده کنید. \fIformat\fR یک رشته قالب استفاده‌شده در \&\fBprintf\fR است. \fIrpl\fR یک رشته جایگزین است. .Sp مثال‌ها: .Sp .Vb 5 \& {#:%04d} \- Job number ({#}) with 4 digits prepended with 0 \& {%:%02d} \- Job slot ({%}) with 2 digits prepended with 0 \& {:%6s} \- Input line ({}) right aligned 6 chars wide \& {/:%12s} \- Basename ({/}) right aligned 12 chars wide \& {2:%8.2f} \- Second input source ({2}) 8 chars wide, 2 decimals .Ve .Sp رشته‌های قالب همچنین روی رشته‌های جایگزین تعریف‌شده از طریق \fB\-\-rpl\fR که با \*(Aq{\*(Aq شروع می‌شوند کار می‌کنند. .Sp همچنین ببینید: \fB{}\fR \fB{\fR\fIn\fR\fB}\fR \fB\-\-rpl\fR .IP "\fB:::\fR \fIarguments\fR" 4 .IX Item "::: arguments" استفاده از آرگومان‌ها در خط فرمان به عنوان منبع ورودی. .Sp برخلاف سایر گزینه‌های GNU \fBparallel\fR، \fB:::\fR پس از \&\fIcommand\fR و قبل از آرگومان‌ها قرار می‌گیرد. .Sp موارد زیر معادل هستند: .Sp .Vb 6 \& (echo file1; echo file2) | parallel gzip \& parallel gzip ::: file1 file2 \& parallel gzip {} ::: file1 file2 \& parallel \-\-arg\-sep ,, gzip {} ,, file1 file2 \& parallel \-\-arg\-sep ,, gzip ,, file1 file2 \& parallel ::: "gzip file1" "gzip file2" .Ve .Sp برای جلوگیری از برخورد ویژه با \fB:::\fR، از \fB\-\-arg\-sep\fR برای تنظیم جداکننده آرگومان به چیزی دیگر استفاده کنید. .Sp اگر چند \fB:::\fR داده شوند، با هر گروه مانند یک منبع ورودی رفتار خواهد شد و تمام ترکیب‌های منابع ورودی تولید می‌شوند. به عنوان مثال، \f(CW::: 1 2 ::: a b c\fR به ترکیب‌های (1,a) (1,b) (1,c) (2,a) (2,b) (2,c) منجر خواهد شد. این قابلیت برای جایگزینی حلقه‌های تو در توی \fBfor\fR مفید است. .Sp می‌توان \fB:::\fR، \fB::::\fR و \fB\-\-arg\-file\fR را با هم ترکیب کرد. بنابراین موارد زیر معادلند: .Sp .Vb 11 \& parallel echo {1} {2} {3} ::: 6 7 ::: 4 5 ::: 1 2 3 \& parallel echo {1} {2} {3} :::: <(seq 6 7) <(seq 4 5) \e \& :::: <(seq 1 3) \& parallel \-a <(seq 6 7) echo {1} {2} {3} :::: <(seq 4 5) \e \& :::: <(seq 1 3) \& parallel \-a <(seq 6 7) \-a <(seq 4 5) echo {1} {2} {3} \e \& ::: 1 2 3 \& seq 6 7 | parallel \-a \- \-a <(seq 4 5) echo {1} {2} {3} \e \& ::: 1 2 3 \& seq 4 5 | parallel echo {1} {2} {3} :::: <(seq 6 7) \- \e \& ::: 1 2 3 .Ve .Sp همچنین ببینید: \fB\-\-arg\-sep\fR \fB\-\-arg\-file\fR \fB::::\fR \fB:::+\fR \fB::::+\fR \fB\-\-link\fR .IP "\fB:::+\fR \fIarguments\fR" 4 .IX Item ":::+ arguments" مانند \fB:::\fR اما مثل \fB\-\-link\fR به منبع ورودی قبلی پیوند داده شده است. .Sp بر خلاف \fB\-\-link\fR، مقادیر چرخش (wrap) ندارند: کوتاه‌ترین منبع ورودی طول را تعیین می‌کند. .Sp مثال: .Sp .Vb 1 \& parallel echo ::: a b c :::+ 1 2 3 ::: X Y :::+ 11 22 .Ve .Sp همچنین ببینید: \fB::::+\fR \fB\-\-link\fR .IP "\fB::::\fR \fIargfiles\fR" 4 .IX Item ":::: argfiles" روش دیگری برای نوشتن \fB\-\-arg\-file\fR \fIargfile1\fR \fB\-\-arg\-file\fR \fIargfile2\fR ... .Sp می‌توان \fB:::\fR و \fB::::\fR را با هم ترکیب کرد. .Sp همچنین ببینید: \fB\-\-arg\-file\fR \fB:::\fR \fB::::+\fR \fB\-\-link\fR .IP "\fB::::+\fR \fIargfiles\fR" 4 .IX Item "::::+ argfiles" مانند \fB::::\fR اما مثل \fB\-\-link\fR به منبع ورودی قبلی پیوند داده شده است. .Sp بر خلاف \fB\-\-link\fR، مقادیر چرخش ندارند: کوتاه‌ترین منبع ورودی طول را تعیین می‌کند. .Sp همچنین ببینید: \fB\-\-arg\-file\fR \fB:::+\fR \fB\-\-link\fR .IP \fB\-\-null\fR 4 .IX Item "--null" .PD 0 .IP \fB\-0\fR 4 .IX Item "-0" .PD استفاده از NUL به عنوان جداکننده. .Sp در حالت عادی خطوط ورودی به \en (خط جدید) ختم می‌شوند. اگر به \e0 (NUL) ختم می‌شوند، از این گزینه استفاده کنید. این گزینه برای پردازش آرگومان‌هایی که ممکن است شامل \en (خط جدید) باشند مفید است. .Sp کوتاه‌شده برای \fB\-\-delimiter \*(Aq\e0\*(Aq\fR. .Sp همچنین ببینید: \fB\-\-delimiter\fR .IP "\fB\-\-arg\-file\fR \fIinput\-file\fR" 4 .IX Item "--arg-file input-file" .PD 0 .IP "\fB\-a\fR \fIinput\-file\fR" 4 .IX Item "-a input-file" .PD استفاده از \fIinput\-file\fR به عنوان منبع ورودی. .Sp اگر چند \fB\-\-arg\-file\fR مشخص شود، با هر \fIinput\-file\fR مانند یک منبع ورودی رفتار خواهد شد و تمام ترکیب‌های منابع ورودی تولید می‌شوند. به عنوان مثال، اگر فایل \fBfoo\fR شامل \fB1 2\fR و فایل \fBbar\fR شامل \fBa b c\fR باشد، دستور \fB\-a foo\fR \fB\-a bar\fR به ترکیب‌های (1,a) (1,b) (1,c) (2,a) (2,b) (2,c) منجر خواهد شد. این قابلیت برای جایگزینی حلقه‌های تو در توی \fBfor\fR مفید است. .Sp اگر \fIinput\-file\fR با \fB+\fR آغاز شود، فایل به \fB\-\-arg\-file\fR قبلی پیوند داده خواهد شد. به عنوان مثال، اگر فایل \fBfoo\fR شامل \fB1 2\fR و فایل \fBbar\fR شامل \fBa b\fR باشد، دستور \fB\-a foo\fR \fB\-a +bar\fR مانند \fB\-\-link\fR به ترکیب‌های (1,a) (2,b) منجر می‌شود به جای اینکه تمام ترکیب‌ها تولید شوند. .Sp همچنین ببینید: \fB\-\-link\fR \fB{\fR\fIn\fR\fB}\fR \fB::::\fR \fB::::+\fR \fB:::\fR .IP "\fB\-\-arg\-file\-sep\fR \fIsep\-str\fR" 4 .IX Item "--arg-file-sep sep-str" استفاده از \fIsep\-str\fR به جای \fB::::\fR به عنوان رشته جداکننده میان دستور و فایل‌های آرگومان. .Sp مفید در صورتی که \fB::::\fR برای کار دیگری توسط دستور استفاده شود. .Sp همچنین ببینید: \fB::::\fR .IP "\fB\-\-arg\-sep\fR \fIsep\-str\fR" 4 .IX Item "--arg-sep sep-str" استفاده از \fIsep\-str\fR به جای \fB:::\fR به عنوان رشته جداکننده. .Sp مفید در صورتی که \fB:::\fR برای کار دیگری توسط دستور استفاده شود. .Sp همچنین زمانی کاربرد دارد که دستور شما از \fB:::\fR استفاده می‌کند اما همچنان می‌خواهید آرگومان‌ها را از ورودی استاندارد (stdin) بخوانید: کافی است \fB\-\-arg\-sep\fR را به رشته‌ای تغییر دهید که در خط فرمان وجود ندارد. .Sp همچنین ببینید: \fB:::\fR .IP \fB\-\-bar\fR 4 .IX Item "--bar" نمایش پیشرفت به صورت یک نوار پیشرفت. .Sp در نوار موارد زیر نمایش داده می‌شوند: درصد کارهای تکمیل‌شده، تخمین ثانیه‌های باقی‌مانده و تعداد کارهای شروع‌شده. .Sp با \fBzenity\fR سازگار است: .Sp .Vb 3 \& seq 1000 | parallel \-j30 \-\-bar \*(Aq(echo {};sleep 0.1)\*(Aq \e \& 2> >(perl \-pe \*(AqBEGIN{$/="\er";$|=1};s/\er/\en/g\*(Aq | \& zenity \-\-progress \-\-auto\-kill) | wc .Ve .Sp همچنین ببینید: \fB\-\-eta\fR \fB\-\-progress\fR \fB\-\-total\-jobs\fR .IP "\fB\-\-basefile\fR \fIfile\fR (beta testing)" 4 .IX Item "--basefile file (beta testing)" .PD 0 .IP "\fB\-\-bf\fR \fIfile\fR (beta testing)" 4 .IX Item "--bf file (beta testing)" .PD پرونده \fIfile\fR قبل از شروع اولین کار به هر sshlogin منتقل خواهد شد. .Sp در صورت فعال بودن \fB\-\-cleanup\fR، پرونده حذف خواهد شد. این فایل می‌تواند اسکریپتی برای اجرا یا داده‌های پایه مشترک مورد نیاز برای کار باشد. می‌توان چندین \&\fB\-\-bf\fR را برای انتقال پرونده‌های پایه بیشتر تعیین کرد. پرونده \fIfile\fR به همان شیوه \fB\-\-transferfile\fR منتقل خواهد شد. .Sp همچنین ببینید: \fB\-\-sshlogin\fR \fB\-\-transfer\fR \fB\-\-return\fR \fB\-\-cleanup\fR \&\fB\-\-workdir\fR .IP "\fB\-\-basenamereplace\fR \fIreplace\-str\fR" 4 .IX Item "--basenamereplace replace-str" .PD 0 .IP "\fB\-\-bnr\fR \fIreplace\-str\fR" 4 .IX Item "--bnr replace-str" .PD استفاده از رشته جایگزین \fIreplace\-str\fR به جای \fB{/}\fR برای نام پایه (basename) خط ورودی. .Sp همچنین ببینید: \fB{/}\fR .IP "\fB\-\-basenameextensionreplace\fR \fIreplace\-str\fR" 4 .IX Item "--basenameextensionreplace replace-str" .PD 0 .IP "\fB\-\-bner\fR \fIreplace\-str\fR" 4 .IX Item "--bner replace-str" .PD استفاده از رشته جایگزین \fIreplace\-str\fR به جای \fB{/.}\fR برای نام پایه خط ورودی بدون پسوند. .Sp همچنین ببینید: \fB{/.}\fR .IP "\fB\-\-bin\fR \fIbinexpr\fR" 4 .IX Item "--bin binexpr" استفاده از \fIbinexpr\fR به عنوان کلید دسته‌بندی و دسته‌بندی ورودی میان کارها. .Sp عبارت \fIbinexpr\fR به صورت [شماره ستون|نام ستون] [عبارت پرل] است، مثلاً: .Sp .Vb 4 \& 3 \& Address \& 3 $_%=100 \& Address s/\eD//g .Ve .Sp هر خط ورودی با استفاده از \fB\-\-colsep\fR تفکیک می‌شود. مقدار ستون در \&\f(CW$_\fR قرار می‌گیرد، عبارت پرل اجرا می‌شود و مقدار حاصل، اسلات کاری خواهد بود که خط به آن داده می‌شود. اگر مقدار از تعداد اسلات‌های کار بزرگ‌تر باشد، مقدار بر تعداد اسلات‌های کار محاسبه پیمانه (modulo) خواهد شد. .Sp این عملکرد شبیه به \fB\-\-shard\fR است اما الگوریتم درهم‌سازی (هش) یک پیمانه ساده است که پیش‌بینی این که کدام اسلات کار کدام مقدار را دریافت خواهد کرد را ممکن می‌سازد. .Sp کارایی در حدود ۱۰۰ هزار ردیف در ثانیه است. اگر \fIbincol\fR کوچک باشد (<10) سریع‌تر و اگر بزرگ باشد (>100) کندتر خواهد بود. .Sp گزینه \fB\-\-bin\fR به \fB\-\-pipe\fR و یک مقدار عددی ثابت برای \fB\-\-jobs\fR نیاز دارد. .Sp همچنین ببینید: SPREADING BLOCKS OF DATA \fB\-\-group\-by\fR \fB\-\-round\-robin\fR \&\fB\-\-shard\fR .IP \fB\-\-bg\fR 4 .IX Item "--bg" اجرای دستور در پس‌زمینه. .Sp دستور GNU \fBparallel\fR معمولاً منتظر اتمام یک کار می‌ماند. با \&\fB\-\-bg\fR دستور GNU \fBparallel\fR قبل از خروج، منتظر تکمیل دستور نخواهد ماند. .Sp اگر \fB\-\-semaphore\fR تنظیم شده باشد، این حالت پیش‌فرض است. .Sp مستلزم \fB\-\-semaphore\fR است. .Sp همچنین ببینید: \fB\-\-fg\fR \fBman sem\fR .IP \fB\-\-bibtex\fR 4 .IX Item "--bibtex" .PD 0 .IP \fB\-\-citation\fR 4 .IX Item "--citation" .PD چاپ اعلان ارجاع و ورودی BibTeX برای GNU \fBparallel\fR، بی‌صدا کردن اعلان ارجاع برای تمام اجراهای آینده، و خروج. هیچ دستوری اجرا نخواهد شد. .Sp اگر اجرای \fB\-\-citation\fR برای شما مقدور نیست، می‌توانید به‌جای آن از \&\fB\-\-will\-cite\fR استفاده کنید که دستورات را اجرا می‌کند، اما اعلان ارجاع را فقط برای همین یک‌بار اجرا بی‌صدا می‌سازد. .Sp اگر از \fB\-\-will\-cite\fR در اسکریپت‌هایی استفاده کنید که قرار است توسط دیگران اجرا شوند، دیدن اعلان ارجاع را برای دیگران دشوارتر می‌کنید. توسعهٔ GNU \fBparallel\fR به‌طور غیرمستقیم از طریق ارجاعات تأمین مالی می‌شود، بنابراین اگر کاربران شما ندانند که باید ارجاع دهند، تأمین مالی توسعه را دشوارتر می‌کنید. با این حال، اگر ۱۰,۰۰۰ یورو پرداخت کنید، سهم خود را در تأمین مالی توسعه‌های آینده ادا کرده‌اید و می‌توانید با خیال راحت از \fB\-\-will\-cite\fR در اسکریپت‌ها استفاده کنید. .Sp اگر نمی‌خواهید با اجازه دادن به سایر کاربران برای دیدن اعلان ارجاع یا با پرداخت هزینه به تأمین مالی توسعهٔ آینده کمک کنید، لطفاً استفاده از ابزار دیگری به‌جای GNU \fBparallel\fR را در نظر بگیرید. می‌توانید برخی از گزینه‌های جایگزین را در \fBman parallel_alternatives\fR بیابید. .IP "\fB\-\-block\fR \fIsize\fR (آزمایشی)" 4 .IX Item "--block size (beta testing)" .PD 0 .IP "\fB\-\-block\-size\fR \fIsize\fR (آزمایشی)" 4 .IX Item "--block-size size (beta testing)" .PD اندازهٔ بلوک برحسب بایت برای خواندن در هر نوبت. .Sp مقدار \fIsize\fR می‌تواند پسوند K، M، G، T، P، k، m، g، t، یا p داشته باشد. .Sp دستور GNU \fBparallel\fR تلاش می‌کند به اندازهٔ بلوک برسد اما ممکن است به اندازهٔ طول یک رکورد خطا داشته باشد. به دلایل کارایی و عملکرد، \fIsize\fR باید بزرگ‌تر از دو رکورد باشد. اگر انتخابی داشته باشید که \fIsize\fR آن بیش از حد کوچک باشد، GNU \fBparallel\fR به شما هشدار داده و اندازه را به‌طور خودکار افزایش می‌دهد. .Sp مقدار پیش‌فرض \fIsize\fR برابر 1M است. .Sp اندازهٔ بلوک منفی به‌عنوان اندازهٔ بلوک تفسیر نمی‌شود، بلکه بیانگر تعداد بلوک‌هایی است که هر اسلات کاری (jobslot) باید داشته باشد. بنابراین \fB\-\-block \-3\fR به ازای هر اسلات کاری ۳ کار ایجاد می‌کند. به عبارت دیگر: این دستور در مجموع ۳*۵ = ۱۵ کار را اجرا خواهد کرد: .Sp .Vb 2 \& parallel \-\-pipe\-part \-a myfile \-\-block \-3 \-j5 wc \& cat myfile | parallel \-\-pipe \-\-block \-3 \-j5 wc .Ve .Sp گزینهٔ \fB\-\-pipe\-part \-\-block\fR جایگزینی کارآمد برای \fB\-\-round\-robin\fR است زیرا داده‌ها هرگز توسط GNU \fBparallel\fR خوانده نمی‌شوند، اما با این حال می‌توانید با تعداد بسیار کمی اسلات کاری مقادیر عظیمی از داده را پردازش کنید. .Sp از سوی دیگر، \fB\-\-pipe \-\-block\fR کاملاً \fIناکارآمد\fR است: تمام فایل را پیش از تقسیم‌بندی در حافظه می‌خواند. در نتیجه ورودی باید قادر باشد در حافظه جای گیرد. .Sp اگر از \fB\-\-block\fR \-\fIsize\fR استفاده می‌کنید، ورودی باید بزرگ‌تر از \fIsize\fR+1 رکورد باشد. .Sp همچنین ببینید: UNIT PREFIX \fB\-N\fR \fB\-\-pipe\fR \fB\-\-pipe\-part\fR \fB\-\-round\-robin\fR \&\fB\-\-block\-timeout\fR .IP "\fB\-\-block\-timeout\fR \fIduration\fR" 4 .IX Item "--block-timeout duration" .PD 0 .IP "\fB\-\-bt\fR \fIduration\fR" 4 .IX Item "--bt duration" .PD مهلت زمانی (تایم‌اوت) برای خواندن بلوک هنگام استفاده از \fB\-\-pipe\fR. .Sp اگر خواندن یک بلوک کامل بیشتر از \fIduration\fR طول بکشد، از همان بلوک ناقصی که تاکنون خوانده شده استفاده می‌شود. .Sp مقدار \fIduration\fR برحسب ثانیه است، اما می‌تواند پسوند s، m، h، یا d داشته باشد. .Sp همچنین ببینید: TIME POSTFIXES \fB\-\-pipe\fR \fB\-\-block\fR .IP "\fB\-\-cat\fR (آزمایشی)" 4 .IX Item "--cat (beta testing)" ایجاد فایل موقت حاوی محتوا. .Sp به‌طور معمول \fB\-\-pipe\fR/\fB\-\-pipe\-part\fR داده‌ها را روی ورودی استاندارد (stdin) به برنامه می‌دهند. با \fB\-\-cat\fR دستور GNU \fBparallel\fR یک فایل موقت با نام موجود در \fB{}\fR ایجاد می‌کند، بنابراین می‌توانید انجام دهید: \fBparallel \&\-\-pipe \-\-cat wc {}\fR. .Sp مستلزم \fB\-\-pipe\fR است مگر اینکه \fB\-\-pipe\-part\fR استفاده شود. .Sp همچنین ببینید: \fB\-\-pipe\fR \fB\-\-pipe\-part\fR \fB\-\-fifo\fR .IP "\fB\-\-cleanup\fR (آزمایشی)" 4 .IX Item "--cleanup (beta testing)" حذف فایل‌های منتقل‌شده. .Sp گزینهٔ \fB\-\-cleanup\fR فایل‌های منتقل‌شده روی رایانهٔ دوردست را پس از اتمام پردازش حذف می‌کند. .Sp .Vb 3 \& find log \-name \*(Aq*gz\*(Aq | parallel \e \& \-\-sshlogin server.example.com \-\-transferfile {} \e \& \-\-return {.}.bz2 \-\-cleanup "zcat {} | bzip \-9 >{.}.bz2" .Ve .Sp با \fB\-\-transferfile {}\fR فایلی که به رایانهٔ دوردست منتقل شده است روی همان رایانهٔ دوردست حذف خواهد شد. دایرکتوری‌های حاوی فایل روی رایانهٔ دوردست در صورتی که خالی باشند حذف خواهند شد. .Sp با \fB\-\-return\fR فایلی که از رایانهٔ دوردست منتقل شده است روی رایانهٔ دوردست حذف خواهد شد. دایرکتوری‌های حاوی فایل روی رایانهٔ دوردست در صورتی که خالی باشند حذف خواهند شد. .Sp اگر \fB\-\-cleanup\fR همراه با \fB\-\-basefile\fR، \&\fB\-\-transfer\fR، \fB\-\-transferfile\fR یا \fB\-\-return\fR استفاده نشود نادیده گرفته می‌شود. .Sp همچنین ببینید: \fB\-\-basefile\fR \fB\-\-transfer\fR \fB\-\-transferfile\fR \fB\-\-sshlogin\fR \&\fB\-\-return\fR .IP \fB\-\-color\fR 4 .IX Item "--color" رنگی کردن خروجی. .Sp رنگی کردن خروجی. هر کار ترکیب رنگی خود را دریافت می‌کند (پس‌زمینه+پیش‌زمینه). .Sp گزینهٔ \fB\-\-color\fR هنگام استفاده از \fB\-u\fR نادیده گرفته می‌شود. .Sp همچنین ببینید: \fB\-\-color\-failed\fR .IP \fB\-\-color\-failed\fR 4 .IX Item "--color-failed" .PD 0 .IP \fB\-\-cf\fR 4 .IX Item "--cf" .PD رنگی کردن خروجی کارهای ناموفق به‌صورت سفید روی قرمز. .Sp زمانی مفید است که تعداد کارهای زیادی دارید و می‌خواهید روی کارهای ناموفق تمرکز کنید. .Sp گزینهٔ \fB\-\-color\-failed\fR هنگام استفاده از \fB\-u\fR و \fB\-\-line\-buffer\fR نادیده گرفته می‌شود و هنگام استفاده از \fB\-\-latest\-line\fR غیرقابل اتکا است. .Sp همچنین ببینید: \fB\-\-color\fR .IP "\fB\-\-colsep\fR \fIregexp\fR" 4 .IX Item "--colsep regexp" .PD 0 .IP "\fB\-C\fR \fIregexp\fR" 4 .IX Item "-C regexp" .PD جداکنندهٔ ستون‌ها. .Sp ورودی به‌عنوان یک جدول در نظر گرفته می‌شود که در آن \fIregexp\fR ستون‌ها را جدا می‌کند. به ستون nام می‌توان با استفاده از \fB{\fR\fIn\fR\fB}\fR یا \&\fB{\fR\fIn\fR.\fB}\fR دسترسی پیدا کرد؛ مانند \fB{3}\fR که ستون سوم است. .Sp اگر منابع ورودی بیشتری وجود داشته باشد، هر منبع ورودی تفکیک می‌شود، اما ستون‌های هر منبع ورودی به یکدیگر متصل خواهند شد. در اینجا {4} به ستون ۲ در منبع ورودی ۲ اشاره دارد: .Sp .Vb 2 \& parallel \-\-colsep \*(Aq\-\*(Aq echo {4} {3} {2} {1} \e \& ::: A\-B C\-D ::: e\-f g\-h .Ve .Sp گزینهٔ \fB\-\-colsep\fR مستلزم \fB\-\-trim rl\fR است، که می‌توان آن را با \&\fB\-\-trim n\fR بازنویسی (override) کرد. .Sp مقدار \fIregexp\fR یک عبارت باقاعده پرل است: https://perldoc.perl.org/perlre.html .Sp همچنین ببینید: \fB\-\-csv\fR \fB{\fR\fIn\fR\fB}\fR \fB\-\-trim\fR \fB\-\-link\fR \fB\-\-match\fR .IP "\fB\-\-combineexec\fR \fIname\fR" 4 .IX Item "--combineexec name" .PD 0 .IP "\fB\-\-combine\-executable\fR \fIname\fR" 4 .IX Item "--combine-executable name" .PD ترکیب GNU \fBparallel\fR با برنامه‌ای دیگر در یک فایل اجرایی واحد. .Sp فرض کنید برنامه‌ای به نام \fImyprg\fR توسعه داده‌اید که یک آرگومان واحد می‌گیرد. نمی‌خواهید خودتان آن را موازی‌سازی کنید. .Sp می‌توانید یک پوشش‌دهنده (wrapper) با استفاده از GNU \fBparallel\fR بنویسید به نام \fBmyparprg\fR: .Sp .Vb 1 \& #!/bin/sh \& \& parallel myprg ::: "$@" .Ve .Sp اما برای اینکه دیگران بتوانند از آن استفاده کنند، باید این موارد را نصب کنند: GNU \fBparallel\fR، \&\fBmyprg\fR، و \fBmyparprg\fR. .Sp اگر همه در یک فایل اجرایی واحد بسته‌بندی می‌شدند، نصب آن آسان‌تر بود. .Sp اگر \fBmyprg\fR در شل نوشته شده باشد، می‌توانید از \fB\-\-embed\fR استفاده کنید. .Sp اگر \fBmyprg\fR یک فایل باینری باشد، می‌توانید از \fB\-\-combineexec\fR استفاده کنید. .Sp در اینجا از \fBgzip\fR به‌عنوان مثال استفاده می‌کنیم: .Sp .Vb 1 \& parallel \-\-combineexec pargzip gzip \-9 ::: .Ve .Sp اکنون می‌توانید انجام دهید: .Sp .Vb 1 \& ./pargzip foo bar baz .Ve .Sp اگر می‌خواهید گزینه‌هایی را به \fBgzip\fR ارسال کنید، می‌توانید انجام دهید: .Sp .Vb 1 \& parallel \-\-combineexec pargzip gzip .Ve .Sp و در ادامه: .Sp .Vb 1 \& ./pargzip \-1 ::: foo bar baz .Ve .Sp همچنین ببینید: \fB\-\-embed\fR \fB\-\-shebang\fR \fB\-\-shebang\-wrap\fR .IP \fB\-\-compress\fR 4 .IX Item "--compress" فشرده‌سازی فایل‌های موقت. .Sp اگر خروجی بزرگ و بسیار فشرده‌پذیر باشد، این گزینه فضای کمتری از دیسک را در \f(CW$TMPDIR\fR اشغال کرده و احتمالاً به‌دلیل کاهش ورودی/خروجی دیسک سریع‌تر خواهد بود. .Sp دستور GNU \fBparallel\fR به ترتیب ابزارهای \fBpzstd\fR، \fBlbzip2\fR، \fBpbzip2\fR، \fBzstd\fR، \&\fBpigz\fR، \fBlz4\fR، \fBlzop\fR، \fBplzip\fR، \fBlzip\fR، \fBlrz\fR، \fBgzip\fR، \fBpxz\fR، \&\fBlzma\fR، \fBbzip2\fR، \fBxz\fR، \fBclzip\fR را امتحان کرده و از اولین گزینهٔ در دسترس استفاده می‌کند. .Sp دستور GNU \fBparallel\fR به ازای هر کاری که در انتظار چاپ شدن است، تا ۸ فرایند را به کار می‌گیرد. برای جزئیات بیشتر به \fBman parallel_design\fR مراجعه کنید. .Sp همچنین ببینید: \fB\-\-compress\-program\fR .IP "\fB\-\-compress\-program\fR \fIprg\fR" 4 .IX Item "--compress-program prg" .PD 0 .IP "\fB\-\-decompress\-program\fR \fIprg\fR" 4 .IX Item "--decompress-program prg" .PD استفاده از \fIprg\fR برای فشرده‌سازی/استخراج فایل‌های موقت. .Sp فرض بر این است که \fIprg \-dc\fR داده‌های ورودی استاندارد (stdin) را استخراج کرده و به خروجی استاندارد (stdout) می‌فرستد مگر اینکه \fB\-\-decompress\-program\fR داده شده باشد. .Sp همچنین ببینید: \fB\-\-compress\fR .IP \fB\-\-csv\fR 4 .IX Item "--csv" برخورد با ورودی به‌صورت قالب CSV. .Sp گزینهٔ \fB\-\-colsep\fR جداکننده فیلدها را تعیین می‌کند. \fB\-\-csv\fR بسیار شبیه به \&\fB\-\-colsep\fR کار می‌کند با این تفاوت که با نقل‌قول‌ها (quotes) به‌درستی رفتار می‌کند. مقایسه کنید: .Sp .Vb 2 \& echo \*(Aq"1 big, 2 small","2""x4"" plank",12.34\*(Aq | \& parallel \-\-csv echo {1} of {2} at {3} \& \& echo \*(Aq"1 big, 2 small","2""x4"" plank",12.34\*(Aq | \& parallel \-\-colsep \*(Aq,\*(Aq echo {1} of {2} at {3} .Ve .Sp حتی خطوط جدید نقل‌قول‌شده نیز به‌درستی تجزیه می‌شوند: .Sp .Vb 3 \& (echo \*(Aq"Start of field 1 with newline\*(Aq \& echo \*(AqLine 2 in field 1";value 2\*(Aq) | \& parallel \-\-csv \-\-colsep \*(Aq;\*(Aq echo Field 1: {1} Field 2: {2} .Ve .Sp هنگام استفاده با \fB\-\-pipe\fR فقط رکوردهای کامل CSV را منتقل می‌کند. .Sp همچنین ببینید: \fB\-\-pipe\fR \fB\-\-link\fR \fB{\fR\fIn\fR\fB}\fR \fB\-\-colsep\fR \fB\-\-header\fR \fB\-\-match\fR .IP "\fB\-\-ctag\fR (منسوخ: از \fB\-\-color\fR \fB\-\-tag\fR استفاده کنید)" 4 .IX Item "--ctag (obsolete: use --color --tag)" برچسب رنگی. .Sp اگر مقادیر در بررسی خروجی بسیار شبیه به نظر برسند، ممکن است تشخیص زمان استفاده از یک مقدار جدید دشوار باشد. گزینهٔ \fB\-\-ctag\fR به هر مقدار یک رنگ تصادفی اختصاص می‌دهد. .Sp همچنین ببینید: \fB\-\-color\fR \fB\-\-tag\fR .IP "\fB\-\-ctagstring\fR \fIstr\fR (منسوخ: از \fB\-\-color\fR \fB\-\-tagstring\fR استفاده کنید)" 4 .IX Item "--ctagstring str (obsolete: use --color --tagstring)" رشته‌برچسب رنگی. .Sp همچنین ببینید: \fB\-\-color\fR \fB\-\-ctag\fR \fB\-\-tagstring\fR .IP "\fB\-\-delay\fR \fIduration\fR" 4 .IX Item "--delay duration" تأخیر در شروع کار بعدی به میزان \fIduration\fR. .Sp دستور GNU \fBparallel\fR به مدت \fIduration\fR کار دیگری را شروع نخواهد کرد. .Sp مقدار \fIduration\fR برحسب ثانیه است، اما می‌تواند پسوند s، m، h، یا d داشته باشد. .Sp اگر عبارت \*(Aqauto\*(Aq را به \fIduration\fR اضافه کنید (مانند 13m3sauto)، دستور GNU \fBparallel\fR به‌طور خودکار سعی می‌کند مقدار بهینه را بیابد: اگر کاری با شکست مواجه شود، \&\fIduration\fR به میزان ۳۰٪ افزایش می‌یابد. اگر کاری با موفقیت انجام شود، \fIduration\fR به میزان ۱۰٪ کاهش می‌یابد. .Sp همچنین ببینید: TIME POSTFIXES \fB\-\-retries\fR \fB\-\-ssh\-delay\fR .IP "\fB\-\-delimiter\fR \fIdelim\fR" 4 .IX Item "--delimiter delim" .PD 0 .IP "\fB\-d\fR \fIdelim\fR" 4 .IX Item "-d delim" .PD رکوردهای ورودی با \fIdelim\fR خاتمه می‌یابند. .Sp جداکنندهٔ مشخص‌شده می‌تواند نویسه‌ها، کدهای اسکیپ به سبک C مانند \en، یا کدهای اسکیپ هشت‌هشتی (\e012) یا شانزده‌شانزدهی (\ex0A) باشد. کدهای اسکیپ هشت‌هشتی و شانزده‌شانزدهی همانند دستور printf درک می‌شوند. .Sp همچنین ببینید: \fB\-\-colsep\fR .IP "\fB\-\-dirnamereplace\fR \fIreplace\-str\fR" 4 .IX Item "--dirnamereplace replace-str" .PD 0 .IP "\fB\-\-dnr\fR \fIreplace\-str\fR" 4 .IX Item "--dnr replace-str" .PD استفاده از رشتهٔ جایگزین \fIreplace\-str\fR به‌جای \fB{//}\fR برای نام دایرکتوری (dirname) خط ورودی. .Sp همچنین ببینید: \fB{//}\fR .IP "\fB\-\-dry\-run\fR (آزمایشی)" 4 .IX Item "--dry-run (beta testing)" چاپ کاری که باید در خروجی استاندارد (stdout) اجرا شود، بدون اجرای واقعی کار. .Sp از \fB\-v \-v\fR استفاده کنید تا کدهای پوشش‌دهنده‌ای که GNU \fBparallel\fR تولید می‌کند نیز گنجانده شوند (برای کارهای دوردست، \fB\-\-tmux\fR، \fB\-\-nice\fR، \fB\-\-pipe\fR، \fB\-\-pipe\-part\fR، \&\fB\-\-fifo\fR و \fB\-\-cat\fR). البته به‌طور تحت‌اللفظی روی این حساب نکنید، زیرا اگر : در فهرست باشد ممکن است کار روی رایانهٔ دیگر یا رایانهٔ محلی زمان‌بندی شود. .Sp همچنین ببینید: \fB\-v\fR .IP "\fB\-E\fR \fIeof\-str\fR" 4 .IX Item "-E eof-str" تنظیم رشته پایان فایل به \fIeof\-str\fR. .Sp اگر رشته پایان فایل به عنوان یک خط از ورودی رخ دهد، بقیه ورودی خوانده نمی‌شود. اگر نه از \fB\-E\fR و نه از \fB\-e\fR استفاده شود، هیچ رشته پایان فایلی استفاده نخواهد شد. .IP \fB\-\-eof\fR[=\fIeof\-str\fR] 4 .IX Item "--eof[=eof-str]" .PD 0 .IP \fB\-e\fR[\fIeof\-str\fR] 4 .IX Item "-e[eof-str]" .PD این گزینه مترادفی برای گزینه \fB\-E\fR است. .Sp به‌جای آن از \fB\-E\fR استفاده کنید، زیرا برای \fBxargs\fR با استاندارد POSIX سازگار است در حالی که این گزینه چنین نیست. اگر \fIeof\-str\fR حذف شود، هیچ رشته پایان فایلی وجود ندارد. اگر نه از \fB\-E\fR و نه از \fB\-e\fR استفاده شود، هیچ رشته پایان فایلی استفاده نخواهد شد. .IP \fB\-\-embed\fR 4 .IX Item "--embed" جاسازی GNU \fBparallel\fR درون یک اسکریپت شل. .Sp اگر نیاز دارید اسکریپت خود را برای شخصی ارسال کنید که مایل به نصب GNU \fBparallel\fR نیست، می‌توانید GNU \fBparallel\fR را درون اسکریپت شل خود جاسازی کنید: .Sp .Vb 1 \& parallel \-\-embed > new_script .Ve .Sp پس از آن کد خود را به انتهای \fBnew_script\fR اضافه می‌کنید. این قابلیت روی \fBash\fR، \fBbash\fR، \fBdash\fR، \fBksh\fR، \fBsh\fR و \fBzsh\fR آزمایش شده است. .IP "\fB\-\-env\fR \fIvar\fR (alpha testing)" 4 .IX Item "--env var (alpha testing)" کپی متغیر محیطی export شده \fIvar\fR. .Sp این گزینه \fIvar\fR را به محیطی که دستور در آن اجرا می‌شود کپی می‌کند. این کار به‌ویژه برای اجرای از راه دور مفید است. .Sp در Bash، متغیر \fIvar\fR می‌تواند یک تابع Bash نیز باشد \- فقط به یاد داشته باشید که تابع را با \fBexport \&\-f\fR خروجی (export) دهید. .Sp متغیر \*(Aq_\*(Aq خاص است. این متغیر تمام متغیرهای محیطی export شده را به‌جز متغیرهای ذکر شده در ~/.parallel/ignored_vars کپی می‌کند. .Sp برای کپی کردن محیط کامل (شامل متغیرهای export شده و نشده، آرایه‌ها و توابع) از \fBenv_parallel\fR استفاده کنید. .Sp همچنین ببینید: \fB\-\-record\-env\fR \fB\-\-session\fR \fB\-\-sshlogin\fR \fIcommand\fR \&\fBenv_parallel\fR .IP \fB\-\-eta\fR 4 .IX Item "--eta" نمایش تعداد ثانیه‌های تخمینی باقی‌مانده تا پایان. .Sp این گزینه GNU \fBparallel\fR را مجبور می‌کند قبل از شروع، تمام کارها را بخواند تا تعداد کل آن‌ها را پیدا کند (مگر اینکه از \fB\-\-total\-jobs\fR استفاده کنید). GNU \fBparallel\fR معمولاً فقط کار بعدی را برای اجرا می‌خواند. .Sp تخمین بر اساس زمان اجرای کارهای پایان‌یافته محاسبه می‌شود، بنابراین اولین تخمین فقط پس از پایان اولین کار نمایش داده خواهد شد. .Sp به معنی فعال‌سازی خودکار \fB\-\-progress\fR است. .Sp همچنین ببینید: \fB\-\-bar\fR \fB\-\-progress\fR \fB\-\-total\-jobs\fR .IP "\fB\-\-extensionreplace\fR \fIreplace\-str\fR" 4 .IX Item "--extensionreplace replace-str" .PD 0 .IP "\fB\-\-er\fR \fIreplace\-str\fR" 4 .IX Item "--er replace-str" .PD استفاده از رشته جایگزین \fIreplace\-str\fR به‌جای \fB{.}\fR برای خط ورودی بدون پسوند. .Sp همچنین ببینید: \fB{.}\fR .IP "\fB\-\-fast\fR (alpha testing)" 4 .IX Item "--fast (alpha testing)" اجرای سریع کارها. .Sp این گزینه بسیاری از قابلیت‌های GNU \fBparallel\fR را غیرفعال می‌کند تا کارها با بیشترین سرعت ممکن اجرا شوند: آن را مانند یک ماشین مسابقه‌ای با نیترو در مقایسه با ولوو در نظر بگیرید. .Sp برای بنچمارک و زمانی که هزاران کار بسیار کوچک دارید کاربردی است. .Sp مقایسه کنید: .Sp .Vb 6 \& # ~10 seconds/1000 jobs \& seq 1000 | time parallel echo | wc \-l \& # ~1 seconds/1000 jobs \& seq 1000 | time parallel \-\-fast echo | wc \-l \& # ~10 seconds/1000000 jobs \& seq 1000000 | time parallel \-\-fast echo | wc \-l .Ve .Sp \&\fBکاملاً پشتیبانی‌شده:\fR .Sp \&\fB{}\fR، \fB\-\-compress\fR/\fB\-\-compress\-program\fR، \fB\-\-dry\-run\fR، \&\fB\-\-jobs\fR، \fB\-\-keep\-order\fR، \fB\-\-nice\fR، \fB\-\-tag\fR، \fB\-\-tagstring\fR (رشته‌های ثابت و \fB{}\fR)، \fB\-\-ungroup\fR. .Sp \&\fBپشتیبانی‌شده اما کندتر (بازگشت به مسیر صف کارها، حدود ۰.۵ میلی‌ثانیه به ازای هر کار):\fR .RS 4 .IP "تمامی رشته‌های جایگزین غیرمعمولی: \fB{.}\fR \fB{/}\fR \fB{//}\fR \fB{/.}\fR \fB{#}\fR \fB{%}\fR \fB{\fR\fIn\fR\fB}\fR." 4 .IX Item "All non-plain replacement strings: {.} {/} {//} {/.} {#} {%} {n}." گزینه \fB\-\-tagstring\fR با رشته‌های جایگزینی غیر از \fB{}\fR. .Sp چندین منبع ورودی (چند \fB:::\fR)، \fB\-a\fR/\fB\-\-arg\-file\fR، \fB::::\fR. .Sp \&\fB\-\-null\fR/\fB\-0\fR، \fB\-d\fR/\fB\-\-delimiter\fR، \fB\-\-colsep\fR/\fB\-C\fR، \fB\-\-csv\fR، \&\fB\-\-link\fR/\fB:::+\fR/\fB::::+\fR، \fB\-N\fR (برای \fIN\fR>1)، \fB\-m\fR، \fB\-X\fR، \&\fB\-\-filter\fR، \fB\-\-trim\fR (مقادیر غیر \fBn\fR). .IP "\fB\-E\fR/\fB\-\-eof\fR: رشته پایان فایل پیاده‌سازی نشده است." 4 .IX Item "-E/--eof: end-of-file string not implemented." .RE .RS 4 .Sp \&\fBپشتیبانی‌شده با معناشناسی اندکی متفاوت:\fR .IP "\fB\-\-group\fR (پیش‌فرض): خروجی بر اساس هر قطعه (شامل چندین کار) گروه‌بندی می‌شود. تمام stdout کارهای یک قطعه قبل از تمام stderr آن‌ها چاپ می‌شود." 4 .IX Item "--group (default): output is grouped per chunk (several jobs). All stdout from jobs in a chunk is printed before all their stderr." .PD 0 .IP "\fB\-\-halt\fR/\fB\-\-halt\-on\-error\fR: تشخیص خطا بر اساس هر قطعه است، بنابراین تا زمانی که یک قطعه کامل از کارها تمام نشود فعال نخواهد شد. مقدار خروج 0 است مگر اینکه \fB\-\-halt\fR تنظیم شده باشد؛ برای انتقال کدهای خروج غیرصفر بدون توقف زودهنگام از \fB\-\-halt never\fR استفاده کنید." 4 .IX Item "--halt/--halt-on-error: failure detection is per chunk, so it will not trigger until a full chunk of jobs has finished. The exit value is 0 unless --halt is set; use --halt never to propagate non-zero exit codes without stopping early." .IP "\fB{=\fR\fIperl\fR\fB=}\fR: عباراتی که نمی‌توان آن‌ها را از پیش محاسبه کرد (مانند \fBslot()\fR) ممکن است مقادیر غیرمنتظره‌ای ارائه دهند." 4 .IX Item "{=perl=}: Expressions that cannot be computed upfront (e.g. slot()) may give unexpected values." .IP "\fB\-\-joblog\fR/\fB\-\-jl\fR: خطوط فرمان طولانی‌تر از ۴ کیلوبایت ممکن است کوتاه (truncate) شوند." 4 .IX Item "--joblog/--jl: Command lines longer than 4 KB may be truncated." .IP "\fB\-\-env\fR: متغیرهای محیطی از طریق \fBfork\fR عادی به ارث برده می‌شوند؛ مکانیزم صریح انتقال محیط \fBparallel\fR فراخوانی نمی‌شود." 4 .IX Item "--env: environment variables are inherited via normal fork; parallel's explicit env-transfer mechanism is not invoked." .PD .RE .RS 4 .Sp \&\fBناقص اما ممکن است با معناشناسی اندکی متفاوت پشتیبانی شود:\fR .IP "\fB\-\-timeout\fR: برای هر قطعه از کارها اعمال می‌شود، نه هر کار به صورت جداگانه." 4 .IX Item "--timeout: applies to each chunk of jobs, not each individual job." .PD 0 .IP "\fB\-\-bar\fR/\fB\-\-eta\fR/\fB\-\-progress\fR: دستور \fBparallel\fR درونی قطعه‌ها را می‌شمارد، نه کارهای جداگانه را، بنابراین شمارش‌ها و تخمین‌های زمانی غیردقیق هستند." 4 .IX Item "--bar/--eta/--progress: the inner parallel counts chunks, not individual jobs, so counts and time estimates are imprecise." .IP "\fB\-\-delay\fR: تاخیر پس از هر قطعه اعمال می‌شود، نه پس از هر کار جداگانه." 4 .IX Item "--delay: delay is applied after each chunk, not after each individual job." .IP "\fB\-\-retries\fR: این گزینه کل گروه کارها را دوباره امتحان می‌کند." 4 .IX Item "--retries: These will retry the whole group of jobs." .IP "\fB\-\-load\fR/\fB\-\-limit\fR/\fB\-\-memfree\fR/\fB\-\-noswap\fR: این گزینه‌ها کل گروه کارها را دوباره امتحان می‌کنند." 4 .IX Item "--load/--limit/--memfree/--noswap: These will retry the whole group of jobs." .PD .RE .RS 4 .Sp \&\fBپشتیبانی‌نشده:\fR .IP "\fB\-\-results\fR/\fB\-o\fR: عدم پشتیبانی از فایل خروجی به ازای هر کار." 4 .IX Item "--results/-o: no per-job output file support." .PD 0 .IP "\fB\-\-tty\fR: کارها stdin (یک پایپ) از \fB/bin/sh\fR را به ارث می‌برند، نه یک ترمینال را." 4 .IX Item "--tty: jobs inherit /bin/sh's stdin (a pipe), not a terminal." .IP "\fB\-L\fR/\fB\-\-max\-lines\fR/\fB\-l\fR: رکوردهای چندخطی پشتیبانی نمی‌شوند." 4 .IX Item "-L/--max-lines/-l: multi-line records not supported." .IP "\fB\-\-verbose\fR/\fB\-t\fR: چاپ دستورات در stderr پیاده‌سازی نشده است." 4 .IX Item "--verbose/-t: echoing commands to stderr not implemented." .IP "\fB\-\-total\-jobs\fR: تعداد کل کارها از قبل مشخص نیست." 4 .IX Item "--total-jobs: total job count is not known ahead of time." .PD .RE .RS 4 .Sp \&\fBغیرممکن با توجه به معماری فعلی:\fR .IP "\fB\-\-pipe\fR/\fB\-\-pipepart\fR/\fB\-\-tee\fR/\fB\-\-fifo\fR/\fB\-\-cat\fR/\fB\-\-header\fR/\fB\-\-group\-by\fR: حالت‌های اجرای جداگانه و ناسازگار با \fB\-\-fast\fR." 4 .IX Item "--pipe/--pipepart/--tee/--fifo/--cat/--header/--group-by: separate execution modes incompatible with --fast." .PD 0 .IP "\fBگزینه‌های SSH/راه‌دور\fR (\fB\-\-sshlogin\fR، \fB\-\-sshloginfile\fR/\fB\-\-slf\fR، \fB\-\-basefile\fR/\fB\-\-bf\fR، \fB\-\-transfer\fR، \fB\-\-return\fR، \fB\-\-cleanup\fR، \fB\-\-trc\fR، \fB\-\-filter\-hosts\fR، \fB\-\-workdir\fR، \fB\-\-hostgroups\fR): گزینه \fB\-\-fast\fR فقط محلی (local) است." 4 .IX Item "SSH/remote options (--sshlogin, --sshloginfile/--slf, --basefile/--bf, --transfer, --return, --cleanup, --trc, --filter-hosts, --workdir, --hostgroups): --fast is local-only." .IP "\fB\-\-tmux\fR/\fB\-\-tmuxpane\fR/\fB\-\-bg\fR/\fB\-\-fg\fR/\fB\-\-wait\fR/\fB\-\-semaphore\fR: حالت‌های اجرای مجزا." 4 .IX Item "--tmux/--tmuxpane/--bg/--fg/--wait/--semaphore: separate execution modes." .PD .RE .RS 4 .Sp اگر به یک گزینه پشتیبانی‌نشده نیاز دارید: گزارش باگ ثبت کنید. .Sp برای جزئیات معماری به \fBparallel_design\fR مراجعه کنید. .RE .IP \fB\-\-fg\fR 4 .IX Item "--fg" اجرای دستور در پیش‌زمینه. .Sp همراه با \fB\-\-tmux\fR و \fB\-\-tmuxpane\fR، ابزار GNU \fBparallel\fR برنامه \fBtmux\fR را در پیش‌زمینه اجرا خواهد کرد. .Sp همراه با \fB\-\-semaphore\fR، ابزار GNU \fBparallel\fR دستور را در پیش‌زمینه اجرا می‌کند (برعکس \fB\-\-bg\fR) و قبل از خروج، منتظر اتمام دستور می‌ماند. کد خروج برابر با کد خروج دستور خواهد بود. .Sp همچنین ببینید: \fB\-\-bg\fR \fBman sem\fR .IP "\fB\-\-fifo\fR (alpha testing)" 4 .IX Item "--fifo (alpha testing)" ایجاد یک fifo موقت حاوی محتوا. .Sp معمولاً \fB\-\-pipe\fR و \fB\-\-pipe\-part\fR داده‌ها را روی stdin (ورودی استاندارد) به برنامه می‌دهند. با \fB\-\-fifo\fR ابزار GNU \fBparallel\fR یک fifo موقت با نام قرار گرفته در \fB{}\fR ایجاد می‌کند، بنابراین می‌توانید انجام دهید: .Sp .Vb 1 \& parallel \-\-pipe \-\-fifo wc {} .Ve .Sp توجه: اگر fifo هرگز برای خواندن باز نشود، کار تا ابد متوقف (block) خواهد شد: .Sp .Vb 2 \& seq 1000000 | parallel \-\-fifo echo This will block forever \& seq 1000000 | parallel \-\-fifo \*(Aqecho This will not block < {}\*(Aq .Ve .Sp با استفاده از \fB\-\-fifo\fR به‌جای \fB\-\-cat\fR می‌توانید در I/O صرفه‌جویی کنید زیرا \fB\-\-cat\fR در یک فایل موقت می‌نویسد، در حالی که \fB\-\-fifo\fR چنین نمی‌کند. .Sp به معنی فعال‌سازی خودکار \fB\-\-pipe\fR است مگر اینکه از \fB\-\-pipe\-part\fR استفاده شود. .Sp همچنین ببینید: \fB\-\-cat\fR \fB\-\-pipe\fR \fB\-\-pipe\-part\fR .IP "\fB\-\-filter\fR \fIfilter\fR (alpha testing)" 4 .IX Item "--filter filter (alpha testing)" فقط کارهایی را اجرا می‌کند که در آن‌ها \fIfilter\fR درست (true) باشد. .Sp عبارت \fIfilter\fR می‌تواند شامل رشته‌های جایگزین و کد Perl باشد. مثال: .Sp .Vb 2 \& parallel \-\-filter \*(Aq{1}+{2}+{3} < 10\*(Aq echo {1},{2},{3} \e \& ::: {1..10} ::: {3..8} ::: {3..10} .Ve .Sp خروجی‌ها: 1,3,3 1,3,4 1,3,5 1,4,3 1,4,4 1,5,3 2,3,3 2,3,4 2,4,3 3,3,3 .Sp .Vb 2 \& parallel \-\-filter \*(Aq{1} < {2}*{2}\*(Aq echo {1},{2} \e \& ::: {1..10} ::: {1..3} .Ve .Sp خروجی‌ها: 1,2 1,3 2,2 2,3 3,2 3,3 4,3 5,3 6,3 7,3 8,3 .Sp .Vb 2 \& parallel \-\-filter \*(Aq{choose_k}\*(Aq \-\-plus echo {1},{2},{3} \e \& ::: {1..5} ::: {1..5} ::: {1..5} .Ve .Sp خروجی‌ها: 1,2,3 1,2,4 1,2,5 1,3,4 1,3,5 1,4,5 2,3,4 2,3,5 2,4,5 3,4,5 .Sp همچنین ببینید: \fBskip()\fR \fB\-\-no\-run\-if\-empty\fR \fB{choose_k}\fR .IP "\fB\-\-filter\-hosts\fR (beta testing)" 4 .IX Item "--filter-hosts (beta testing)" حذف میزبان‌های از کار افتاده (down). .Sp برای هر میزبان دوردست: بررسی می‌کند که آیا ورود از طریق ssh کار می‌کند یا خیر. اگر کار نکند: از این میزبان استفاده نمی‌شود. .Sp به دلایل کارایی، این بررسی فقط در ابتدا و هر بار که \fB\-\-sshloginfile\fR تغییر کند انجام می‌شود. اگر میزبانی پس از اولین بررسی از کار بیفتد، تا زمان تغییر \fB\-\-sshloginfile\fR شناسایی نخواهد شد؛ برای کاهش اثر این مشکل می‌توان از \fB\-\-retries\fR استفاده کرد. .Sp در حال حاضر \fIنمی‌توانید\fR \fB\-\-filter\-hosts\fR را در یک پروفایل، \f(CW$PARALLEL\fR، /etc/parallel/config یا موارد مشابه قرار دهید. این به این دلیل است که GNU \fBparallel\fR از GNU \fBparallel\fR برای محاسبه این مورد استفاده می‌کند، بنابراین وارد یک حلقه بی‌نهایت خواهید شد. این مورد احتمالاً در انتشار بعدی برطرف خواهد شد. .Sp همچنین ببینید: \fB\-\-sshloginfile\fR \fB\-\-sshlogin\fR \fB\-\-retries\fR .IP \fB\-\-gnu\fR 4 .IX Item "--gnu" رفتار مشابه با GNU \fBparallel\fR. .Sp این گزینه از نظر تاریخی بر \fB\-\-tollef\fR اولویت داشت. گزینه \fB\-\-tollef\fR اکنون بازنشسته شده است و بنابراین نباید استفاده شود. گزینه \fB\-\-gnu\fR برای سازگاری حفظ شده است، اما کاری انجام نمی‌دهد. .IP \fB\-\-group\fR 4 .IX Item "--group" گروه‌بندی خروجی. .Sp خروجی هر کار با هم گروه‌بندی شده و تنها پس از اتمام دستور چاپ می‌شود. ابتدا stdout (خروجی استاندارد) و سپس stderr (خطای استاندارد). .Sp این عمل در حدود ۰.۵ میلی‌ثانیه زمان CPU به ازای هر کار می‌برد و برای خروجی‌های بزرگ‌تر به سرعت دیسک شما بستگی دارد. .Sp گزینه \fB\-\-group\fR پیش‌فرض است. .Sp همراه با \fB\-\-fast\fR: خروجی به ازای هر قطعه گروه‌بندی می‌شود (یک قطعه شامل چندین کار است). درون یک قطعه، خروجی‌های stdout و stderr هر کار به ترتیب طبیعی ظاهر می‌شوند (کارها به صورت متوالی اجرا می‌شوند)، اما \fBparallel\fR درونی تمام stdout یک قطعه را قبل از تمام stderr آن بافر می‌کند. برای برچسب‌گذاری صحیح به ازای هر کار از \fB\-\-tag\fR استفاده کنید. .Sp همچنین ببینید: \fB\-\-line\-buffer\fR \fB\-\-ungroup\fR \fB\-\-tag\fR .IP "\fB\-\-group\-by\fR \fIval\fR (alpha testing)" 4 .IX Item "--group-by val (alpha testing)" گروه‌بندی ورودی بر اساس مقدار. .Sp در ترکیب با \fB\-\-pipe\fR/\fB\-\-pipe\-part\fR، گزینه \fB\-\-group\-by\fR خطوط با مقدار یکسان را در یک رکورد گروه‌بندی می‌کند. .Sp مقدار را می‌توان از کل خط یا از یک ستون منفرد محاسبه کرد. .Sp مقدار \fIval\fR می‌تواند موارد زیر باشد: .RS 4 .IP " شماره ستون" 15 .IX Item " column number" استفاده از مقدار موجود در ستون با شماره مشخص‌شده. .IP " نام ستون" 15 .IX Item " column name" خط اول را به عنوان هدر در نظر گرفته و از مقدار موجود در ستون با نام مشخص‌شده استفاده می‌کند. .Sp (همراه با \fB\-\-pipe\-part\fR پشتیبانی نمی‌شود). .IP " عبارت perl" 15 .IX Item " perl expression" اجرای عبارت perl و استفاده از \f(CW$_\fR به عنوان مقدار. .IP " عبارت perl شماره ستون" 15 .IX Item " column number perl expression" قرار دادن مقدار ستون در \f(CW$_\fR، اجرای عبارت perl و استفاده از \f(CW$_\fR به عنوان مقدار. .IP " عبارت perl نام ستون" 15 .IX Item " column name perl expression" قرار دادن مقدار ستون در \f(CW$_\fR، اجرای عبارت perl و استفاده از \f(CW$_\fR به عنوان مقدار. .Sp (همراه با \fB\-\-pipe\-part\fR پشتیبانی نمی‌شود). .RE .RS 4 .Sp مثال: .Sp .Vb 7 \& UserID, Consumption \& 123, 1 \& 123, 2 \& 12\-3, 1 \& 221, 3 \& 221, 1 \& 2/21, 5 .Ve .Sp اگر می‌خواهید 123، 12\-3، 221 و 2/21 را در ۴ رکورد گروه‌بندی کرده و هر بار یک رکورد را به \fBwc\fR ارسال کنید: .Sp .Vb 2 \& tail \-n +2 table.csv | \e \& parallel \-\-pipe \-\-colsep , \-\-group\-by 1 \-kN1 wc .Ve .Sp واداشتن GNU \fBparallel\fR به در نظر گرفتن خط اول به عنوان هدر: .Sp .Vb 2 \& cat table.csv | \e \& parallel \-\-pipe \-\-colsep , \-\-header : \-\-group\-by 1 \-kN1 wc .Ve .Sp آدرس‌دهی ستون بر اساس نام ستون: .Sp .Vb 2 \& cat table.csv | \e \& parallel \-\-pipe \-\-colsep , \-\-header : \-\-group\-by UserID \-kN1 wc .Ve .Sp اگر 12\-3 و 123 در واقع همان یک UserID یکسان هستند، هنگام گروه‌بندی کاراکترهای غیرعددی را در UserID حذف کنید: .Sp .Vb 2 \& cat table.csv | parallel \-\-pipe \-\-colsep , \-\-header : \e \& \-\-group\-by \*(AqUserID s/\eD//g\*(Aq \-kN1 wc .Ve .Sp همچنین ببینید: SPREADING BLOCKS OF DATA \fB\-\-pipe\fR \fB\-\-pipe\-part\fR \fB\-\-bin\fR \&\fB\-\-shard\fR \fB\-\-round\-robin\fR .RE .IP \fB\-\-help\fR 4 .IX Item "--help" .PD 0 .IP \fB\-h\fR 4 .IX Item "-h" .PD چاپ خلاصه‌ای از گزینه‌های GNU \fBparallel\fR و خروج. .IP "\fB\-\-halt\-on\-error\fR \fIval\fR" 4 .IX Item "--halt-on-error val" .PD 0 .IP "\fB\-\-halt\fR \fIval\fR" 4 .IX Item "--halt val" .PD GNU \fBparallel\fR چه زمانی باید پایان یابد؟ .Sp در برخی شرایط اجرای تمام کارها بی‌معنی است. GNU \&\fBparallel\fR باید به محض برآورده شدن یک شرط متوقف شود. .Sp مقدار پیش‌فرض \&\fIval\fR برابر \fBnever\fR است، که تمام کارها را تحت هر شرایطی اجرا می‌کند. .Sp همچنین \&\fIval\fR می‌تواند به شکل \fIwhen\fR,\fIwhy\fR باشد. .Sp مقدار \&\fIwhen\fR می‌تواند \*(Aqnow\*(Aq باشد که به معنی متوقف کردن (kill) تمام کارهای در حال اجرا و پایان فوری است، یا می‌تواند \*(Aqsoon\*(Aq باشد که یعنی منتظر اتمام کارهای در حال اجرا بماند اما کار جدیدی شروع نکند. .Sp مقدار \&\fIwhy\fR می‌تواند \*(Aqfail=X\*(Aq، \*(Aqfail=Y%\*(Aq، \*(Aqsuccess=X\*(Aq، \*(Aqsuccess=Y%\*(Aq، \&\*(Aqdone=X\*(Aq، یا \*(Aqdone=Y%\*(Aq باشد که در آن X تعداد کارهایی است که باید پیش از توقف ناموفق شوند، موفق شوند یا کامل گردند، و Y درصد کارهایی است که باید پیش از توقف ناموفق شوند، موفق شوند یا کامل گردند. .Sp مثال: .RS 4 .IP " \-\-halt now,fail=1" 23 .IX Item " --halt now,fail=1" خروج هنگام شکست یک کار. کارهای در حال اجرا متوقف می‌شوند. .IP " \-\-halt soon,fail=3" 23 .IX Item " --halt soon,fail=3" خروج هنگام شکست ۳ کار، اما منتظر تکمیل کارهای در حال اجرا می‌ماند. .IP " \-\-halt soon,fail=3%" 23 .IX Item " --halt soon,fail=3%" خروج هنگامی که ۳٪ کارها ناموفق شوند، اما منتظر تکمیل کارهای در حال اجرا می‌ماند. .IP " \-\-halt now,success=1" 23 .IX Item " --halt now,success=1" خروج هنگام موفقیت یک کار. کارهای در حال اجرا متوقف می‌شوند. .IP " \-\-halt soon,success=3" 23 .IX Item " --halt soon,success=3" خروج هنگام موفقیت ۳ کار، اما منتظر تکمیل کارهای در حال اجرا می‌ماند. .IP " \-\-halt now,success=3%" 23 .IX Item " --halt now,success=3%" خروج هنگامی که ۳٪ کارها موفق شوند. کارهای در حال اجرا متوقف می‌شوند. .IP " \-\-halt now,done=1" 23 .IX Item " --halt now,done=1" خروج هنگام پایان یک کار. کارهای در حال اجرا متوقف می‌شوند. .IP " \-\-halt soon,done=3" 23 .IX Item " --halt soon,done=3" خروج هنگام پایان ۳ کار، اما منتظر تکمیل کارهای در حال اجرا می‌ماند. .IP " \-\-halt now,done=3%" 23 .IX Item " --halt now,done=3%" خروج هنگامی که ۳٪ کارها به پایان برسند. کارهای در حال اجرا متوقف می‌شوند. .RE .RS 4 .Sp برای سازگاری با نسخه‌های پیشین این موارد نیز کار می‌کنند: .IP 0 12 never .IP 1 12 .IX Item "1" soon,fail=1 .IP 2 12 .IX Item "2" now,fail=1 .IP \-1 12 .IX Item "-1" soon,success=1 .IP \-2 12 .IX Item "-2" now,success=1 .IP 1\-99% 12 .IX Item "1-99%" soon,fail=1\-99% .RE .RS 4 .RE .IP "\fB\-\-header\fR \fIregexp\fR" 4 .IX Item "--header regexp" استفاده از عبارت باقاعده (regexp) به‌عنوان سرآیند (header). .Sp برای استفاده عادی، سرآیند تطبیق‌یافته (معمولاً خط اول: \&\fB\-\-header \*(Aq.*\en\*(Aq\fR) با استفاده از \fB\-\-colsep\fR (که مقدار پیش‌فرض آن \*(Aq\et\*(Aq است) تقسیم می‌شود و نام ستون‌ها می‌توانند به‌عنوان متغیرهای جایگزین استفاده شوند: \fB{column name}\fR، \fB{column name/}\fR، \fB{column name//}\fR، \&\fB{column name/.}\fR، \fB{column name.}\fR، \fB{=column name perl expression =}\fR، .. .Sp برای \fB\-\-pipe\fR، سرآیند تطبیق‌یافته به ابتدای هر خروجی افزوده خواهد شد. .Sp گزینه \&\fB\-\-header :\fR نام مستعاری برای \fB\-\-header \*(Aq.*\en\*(Aq\fR است. .Sp اگر \fIregexp\fR یک عدد باشد، تعداد ثابتی از خطوط در نظر گرفته می‌شود. .Sp گزینه \&\fB\-\-header 0\fR حالت ویژه‌ای است: رشته‌های جایگزین را برای فایل‌های داده‌شده با \fB\-\-arg\-file\fR یا \fB::::\fR ایجاد می‌کند. این گزینه \fB{foo/bar}\fR را برای فایل \fBfoo/bar\fR تولید خواهد کرد. .Sp همچنین ببینید: \fB\-\-colsep\fR \fB\-\-pipe\fR \fB\-\-pipe\-part\fR \fB\-\-arg\-file\fR .IP \fB\-\-hostgroups\fR 4 .IX Item "--hostgroups" .PD 0 .IP \fB\-\-hgrp\fR 4 .IX Item "--hgrp" .PD فعال‌سازی گروه‌های میزبان (hostgroups) روی آرگومان‌ها. .Sp اگر یک آرگومان حاوی \*(Aq@\*(Aq باشد، رشته پس از \*(Aq@\*(Aq حذف شده و به‌عنوان فهرستی از گروه‌های میزبان که این کار مجاز به اجرا روی آن‌هاست در نظر گرفته می‌شود. اگر هیچ \fB\-\-sshlogin\fR با گروه متناظر وجود نداشته باشد، کار روی هر گروه میزبانی اجرا خواهد شد. .Sp مثال: .Sp .Vb 4 \& parallel \-\-hostgroups \e \& \-\-sshlogin @grp1/myserver1 \-S @grp1+grp2/myserver2 \e \& \-\-sshlogin @grp3/myserver3 \e \& echo ::: my_grp1_arg@grp1 arg_for_grp2@grp2 third@grp1+grp3 .Ve .Sp \&\fBmy_grp1_arg\fR ممکن است روی \fBmyserver1\fR یا \fBmyserver2\fR اجرا شود، \&\fBthird\fR ممکن است روی \fBmyserver1\fR یا \fBmyserver3\fR اجرا شود، اما \fBarg_for_grp2\fR فقط روی \fBmyserver2\fR اجرا خواهد شد. .Sp همچنین ببینید: \fB\-\-sshlogin\fR \fR\f(CB$PARALLEL_HOSTGROUPS\fR\fB\fR \fB\fR\f(CB$PARALLEL_ARGHOSTGROUPS\fR\fB\fR .IP "\fB\-I\fR \fIreplace\-str\fR" 4 .IX Item "-I replace-str" استفاده از رشته جایگزین \fIreplace\-str\fR به‌جای \fB{}\fR. .Sp همچنین ببینید: \fB{}\fR .IP "\fB\-\-replace\fR [\fIreplace\-str\fR]" 4 .IX Item "--replace [replace-str]" .PD 0 .IP "\fB\-i\fR [\fIreplace\-str\fR]" 4 .IX Item "-i [replace-str]" .PD این گزینه منسوخ شده است؛ به‌جای آن از \fB\-I\fR استفاده کنید. .Sp اگر \fIreplace\-str\fR مشخص شده باشد، این گزینه مترادفی برای \fB\-I\fR\fIreplace\-str\fR است، و در غیر این صورت مترادفی برای \fB\-I {}\fR خواهد بود. .Sp همچنین ببینید: \fB{}\fR .IP "\fB\-\-joblog\fR \fIlogfile\fR" 4 .IX Item "--joblog logfile" .PD 0 .IP "\fB\-\-jl\fR \fIlogfile\fR" 4 .IX Item "--jl logfile" .PD فایل گزارش (logfile) برای کارهای اجراشده. .Sp ذخیره فهرستی از کارهای اجراشده در \fIlogfile\fR در قالب جداشده با TAB به ترتیب زیر: شماره ترتیب، sshlogin، زمان شروع بر حسب ثانیه از مبدأ زمان (epoch)، مدت زمان اجرا بر حسب ثانیه، بایت‌های انتقال‌یافته در فایل‌ها، بایت‌های برگشتی در فایل‌ها، وضعیت خروج، سیگنال و دستور اجراشده. .Sp برای \fB\-\-pipe\fR، بایت‌های انتقال‌یافته و بایت‌های برگشتی به معنی تعداد بایت‌های ورودی و خروجی هستند. .Sp اگر پیش از \fBlogfile\fR علامت \*(Aq+\*(Aq قرار گیرد، خطوط گزارش به انتهای فایل لاگ افزوده خواهند شد. .Sp برای تبدیل زمان‌ها به قالب دقیق ISO\-8601 دستور زیر را اجرا کنید: .Sp .Vb 2 \& cat logfile | perl \-a \-F"\et" \-ne \e \& \*(Aqchomp($F[2]=\`date \-d \e@$F[2] +%FT%T\`); print join("\et",@F)\*(Aq .Ve .Sp اگر نام میزبان طولانی است، می‌توانید از \fBcolumn \-t\fR برای چاپ مرتب و مناسب‌تر آن استفاده کنید: .Sp .Vb 1 \& cat joblog | column \-t .Ve .Sp همچنین ببینید: \fB\-\-resume\fR \fB\-\-resume\-failed\fR \fB\-\-progress\fR .IP "\fB\-\-jobs\fR \fInum\fR" 4 .IX Item "--jobs num" .PD 0 .IP "\fB\-j\fR \fInum\fR" 4 .IX Item "-j num" .IP "\fB\-\-max\-procs\fR \fInum\fR" 4 .IX Item "--max-procs num" .IP "\fB\-P\fR \fInum\fR" 4 .IX Item "-P num" .PD تعداد شیارهای کار (jobslots) روی هر ماشین. .Sp اجرای حداکثر \fInum\fR کار به‌صورت موازی. مقدار پیش‌فرض 100% است. .RS 4 .IP \fInum\fR 7 .IX Item "num" اجرای حداکثر \fInum\fR کار به‌صورت موازی. .IP 0 7 اجرای تا جای ممکن کار (تعیین این مقدار ممکن است زمان‌بر باشد). .Sp به دلیل یک باگ، گزینه \fB\-j 0\fR رشته‌های جایگزین را به تعداد jobslotها دو بار ارزیابی می‌کند: .Sp .Vb 4 \& # This will not count from 1 but from number\-of\-jobslots \& seq 10000 | parallel \-j0 echo \*(Aq{= $_ = $foo++; =}\*(Aq | head \& # This will count from 1 \& seq 10000 | parallel \-j100 echo \*(Aq{= $_ = $foo++; =}\*(Aq | head .Ve .IP \fInum\fR% 7 .IX Item "num%" ضرب تعداد رشته‌های پردازنده (CPU threads) در \fInum\fR درصد. مثلاً 100% به معنی یک کار به ازای هر thread پردازنده در هر ماشین است. .IP +\fInum\fR 7 .IX Item "+num" افزودن \fInum\fR به تعداد رشته‌های پردازنده. .IP \-\fInum\fR 7 .IX Item "-num" کم کردن \fInum\fR از تعداد رشته‌های پردازنده. .IP \fIexpr\fR 7 .IX Item "expr" ارزیابی عبارت \fIexpr\fR. مثلاً \*(Aq12/2\*(Aq برای مقدار 6، \*(Aq+25%\*(Aq نتیجه یکسانی با \&\*(Aq125%\*(Aq دارد، یا عبارات پیچیده مانند \*(Aq+3*log(55)%\*(Aq که به معنی: ضرب ۳ در log(55)، ضرب نتیجه در تعداد رشته‌های پردازنده و تقسیم بر ۱۰۰، و افزودن این مقدار به تعداد رشته‌های پردازنده است. .Sp عبارتی که مقدار آن کمتر از ۱ ارزیابی شود با ۱ جایگزین می‌شود. .IP \fIprocfile\fR 7 .IX Item "procfile" خواندن پارامتر از فایل. .Sp استفاده از محتوای \fIprocfile\fR به‌عنوان پارامتر برای \&\fI\-j\fR. برای مثال \fIprocfile\fR می‌تواند شامل رشته 100% یا +2 یا 10 باشد. .Sp اگر \fIprocfile\fR پس از پایان یک کار تغییر کند، \fIprocfile\fR دوباره خوانده شده و تعداد کارهای جدید محاسبه می‌شود. اگر تعداد کمتر از مقدار پیشین باشد، کارهای در حال اجرا اجازه تکمیل دارند اما کار جدیدی تا رسیدن به تعداد مطلوب کارها شروع نخواهد شد. این قابلیت امکان تغییر تعداد کارهای همزمان را در حین اجرای GNU \fBparallel\fR فراهم می‌کند. .IP \fInum\fRauto 7 .IX Item "numauto" اگر \fInum\fR به auto ختم شود، GNU \fBparallel\fR آن مقدار را به‌عنوان حداکثر در نظر می‌گیرد. اگر یک کار شکست بخورد، GNU \fBparallel\fR تعداد کارها را با یک ضریب کاهش می‌دهد. اگر کاری موفق شود، GNU \fBparallel\fR تعداد کارها را با ضریبی کوچک افزایش می‌دهد. .Sp بنابراین اگر تعداد کارها کمی بیش از حد زیاد باشد، GNU \fBparallel\fR به شکل پویا آن را کاهش می‌دهد. .Sp مثال: .Sp .Vb 8 \& # This fails if there are more than n sleeps running \& n_sleeps() { \& nsleeps=$(ps aux | grep sleep | grep 12345 | wc \-l) \& echo $nsleeps sleeps running now \& [ $nsleeps \-lt $1 ] \& } \& export \-f n_sleeps \& parallel \-\-jobs 20auto \*(Aqsleep 2.${RANDOM}{}12345; n_sleeps 5\*(Aq ::: {1..100} .Ve .Sp این دستور ۲۰ کار را به‌صورت همزمان آغاز می‌کند. این کارها به دلیل اجرای بیش از ۵ فرآیند sleep شکست خواهند خورد. GNU \fBparallel\fR تعداد کارها را تنظیم می‌کند تا حدود ۵ کار به‌صورت موازی اجرا شوند. .RE .RS 4 .Sp اگر عدد ارزیابی‌شده کمتر از ۱ باشد، مقدار ۱ استفاده خواهد شد. .Sp اگر \fB\-\-semaphore\fR تنظیم شده باشد، مقدار پیش‌فرض ۱ است و در نتیجه یک mutex ایجاد می‌کند. .Sp همچنین ببینید: \fB\-\-use\-cores\-instead\-of\-threads\fR \&\fB\-\-use\-sockets\-instead\-of\-threads\fR .RE .IP "\fB\-\-keep\-order\fR (alpha testing)" 4 .IX Item "--keep-order (alpha testing)" .PD 0 .IP "\fB\-k\fR (alpha testing)" 4 .IX Item "-k (alpha testing)" .PD حفظ ترتیب خروجی دقیقاً مشابه با ترتیب ورودی. .Sp به‌طور معمول خروجی هر کار به محض اتمام آن کار چاپ می‌شود. برای مشاهده تفاوت دستورهای زیر را امتحان کنید: .Sp .Vb 2 \& parallel \-j4 sleep {}\e; echo {} ::: 2 1 4 3 \& parallel \-j4 \-k sleep {}\e; echo {} ::: 2 1 4 3 .Ve .Sp در صورت استفاده همراه با \fB\-\-onall\fR یا \fB\-\-nonall\fR، خروجی‌ها بر اساس sshlogin به صورت مرتب‌شده دسته‌بندی می‌شوند. .Sp گزینه \&\fB\-\-keep\-order\fR هنگام استفاده با \fB\-\-pipe \-\-round\-robin\fR نمی‌تواند ترتیب خروجی را حفظ کند. در اینجا در عوض به این معنی است که در صورت ثابت ماندن ورودی، شیارهای کار (jobslots) در هر اجرا همان بلوک‌ها را به‌عنوان ورودی و با همان ترتیب دریافت خواهند کرد. هر یک از این موارد را دو بار اجرا و مقایسه کنید: .Sp .Vb 2 \& seq 10000000 | parallel \-\-pipe \-\-round\-robin \*(Aqsleep 0.$RANDOM; wc\*(Aq \& seq 10000000 | parallel \-\-pipe \-k \-\-round\-robin \*(Aqsleep 0.$RANDOM; wc\*(Aq .Ve .Sp گزینه \&\fB\-k\fR فقط بر ترتیبی که خروجی چاپ می‌شود تأثیر می‌گذارد \- نه بر ترتیب اجرای کارها. .Sp همچنین ببینید: \fB\-\-group\fR \fB\-\-line\-buffer\fR .IP "\fB\-L\fR \fIrecsize\fR" 4 .IX Item "-L recsize" در صورت استفاده همراه با \fB\-\-pipe\fR: خواندن رکوردهایی به اندازه \fIrecsize\fR. .Sp در غیر این صورت: استفاده از حداکثر \fIrecsize\fR خط ورودی غیرخالی در هر خط فرمان. فاصله‌های خالی انتهایی باعث می‌شوند که یک خط ورودی به شکل منطقی در خط ورودی بعدی ادامه یابد. .Sp گزینه \&\fB\-L 0\fR به معنی خواندن یک خط است، اما ۰ آرگومان را در خط فرمان درج می‌کند. .Sp مقدار \&\fIrecsize\fR می‌تواند پسوندهای K، M، G، T، P، k، m، g، t، یا p داشته باشد. .Sp گزینه \fB\-X\fR را فعال می‌کند مگر اینکه \fB\-m\fR، \fB\-\-xargs\fR یا \fB\-\-pipe\fR تنظیم شده باشد. .Sp همچنین ببینید: UNIT PREFIX \fB\-N\fR \fB\-\-max\-lines\fR \fB\-\-block\fR \fB\-X\fR \fB\-m\fR \&\fB\-\-xargs\fR \fB\-\-pipe\fR .IP "\fB\-\-max\-lines\fR [\fIrecsize\fR]" 4 .IX Item "--max-lines [recsize]" .PD 0 .IP \fB\-l\fR[\fIrecsize\fR] 4 .IX Item "-l[recsize]" .PD در صورت استفاده همراه با \fB\-\-pipe\fR: خواندن رکوردهایی با اندازه \fIrecsize\fR خط. .Sp در غیر این صورت: مترادفی برای گزینه \fB\-L\fR. برخلاف \fB\-L\fR، آرگومان \&\fIrecsize\fR اختیاری است. اگر \fIrecsize\fR مشخص نشود، مقدار پیش‌فرض آن یک خواهد بود. گزینه \fB\-l\fR منسوخ شده است چرا که استاندارد POSIX گزینه \&\fB\-L\fR را به‌جای آن تعیین کرده است. .Sp گزینه \&\fB\-l 0\fR نام مستعاری برای \fB\-l 1\fR است. .Sp گزینه \fB\-X\fR را فعال می‌کند مگر اینکه \fB\-m\fR، \fB\-\-xargs\fR یا \fB\-\-pipe\fR تنظیم شده باشد. .Sp همچنین ببینید: UNIT PREFIX \fB\-N\fR \fB\-\-block\fR \fB\-X\fR \fB\-m\fR \&\fB\-\-xargs\fR \fB\-\-pipe\fR .IP "\fB\-\-limit\fR ""\fIcommand\fR \fIargs\fR""" 4 .IX Item "--limit ""command args""" محدودیت پویای کار. .Sp پیش از شروع یک کار جدید، دستور \fIcommand\fR را با آرگومان‌های \fIargs\fR اجرا می‌کند. مقدار وضعیت خروج \&\fIcommand\fR تعیین می‌کند که GNU \fBparallel\fR چه کاری انجام دهد: .RS 4 .IP 0 4 پایین‌تر از حد مجاز. کار دیگری را شروع کن. .IP 1 4 .IX Item "1" فراتر از حد مجاز. هیچ کاری را شروع نکن. .IP 2 4 .IX Item "2" بسیار فراتر از حد مجاز. جدیدترین کار را متوقف کن. .RE .RS 4 .Sp می‌توانید از هر دستور شل استفاده کنید. ۳ دستور از پیش‌تعریف‌شده وجود دارد: .IP """io \fIn\fR""" 10 .IX Item """io n""" محدودیت برای I/O. مقدار I/O دیسک به‌صورت عددی بین 0\-100 محاسبه خواهد شد که در آن 0 به معنی عدم وجود I/O و 100 به معنای اشباع ۱۰۰ درصدی حداقل یک دیسک است. .IP """load \fIn\fR""" 10 .IX Item """load n""" مشابه \fB\-\-load\fR. .IP """mem \fIn\fR""" 10 .IX Item """mem n""" مشابه \fB\-\-memfree\fR. .RE .RS 4 .Sp همچنین ببینید: \fB\-\-memfree\fR \fB\-\-load\fR .RE .IP \fB\-\-latest\-line\fR 4 .IX Item "--latest-line" .PD 0 .IP \fB\-\-ll\fR 4 .IX Item "--ll" .PD چاپ آخرین سطر. هر کار یک سطر مجزا روی صفحه دریافت می‌کند که با آخرین سطر کامل کارهای در حال اجرا به‌روزرسانی می‌شود. .Sp صفحه نمایش قدیمی‌ترین کار در حال اجرا را در دید نگه می‌دارد، بنابراین ممکن است کارهای جدیدتر دیده نشوند. با این حال، با پایان یافتن قدیمی‌ترین کار، این کارها نمایش داده خواهند شد. .Sp اجرای این مثال درک آن را آسان‌تر می‌کند. دقت کنید که با پایان یافتن کار بالای صفحه، چگونه صفحه اسکرول می‌شود: .Sp .Vb 7 \& slow_seq() { \& # Run seq with 33 characters per second \& seq "$@" | \& perl \-ne \*(Aq$|=1; for(split//){ print; select($a,$a,$a,0.03);}\*(Aq \& } \& export \-f slow_seq \& parallel \-\-shuf \-j99 \-\-ll \-\-tag \-\-bar \-\-color slow_seq {} ::: {1..300} .Ve .Sp همچنین ببینید: \fB\-\-line\-buffer\fR .IP \fB\-\-line\-buffer\fR 4 .IX Item "--line-buffer" .PD 0 .IP \fB\-\-lb\fR 4 .IX Item "--lb" .PD بافر کردن خروجی بر مبنای سطر. .Sp گزینه \fB\-\-group\fR خروجی را برای کل یک کار یکپارچه نگه می‌دارد. گزینه \fB\-\-ungroup\fR اجازه می‌دهد خروجی کارها با هم مخلوط شوند؛ به‌طوری‌که نیمی از یک سطر از یک کار و نیمی از کار دیگری بیاید. گزینه \fB\-\-line\-buffer\fR بین این دو قرار می‌گیرد: برنامه GNU \fBparallel\fR یک سطر کامل را چاپ می‌کند، اما اجازه می‌دهد سطرهای کارهای مختلف با یکدیگر ترکیب شوند. .Sp گزینه \fB\-\-line\-buffer\fR توان پردازشی بیشتری از CPU نسبت به هر دو گزینه \fB\-\-group\fR و \&\fB\-\-ungroup\fR مصرف می‌کند، اما اگر CPU عامل محدودکننده نباشد، می‌تواند بسیار سریع‌تر از \fB\-\-group\fR عمل کند. .Sp به‌طور معمول \fB\-\-line\-buffer\fR روی دیسک بافر نمی‌کند، بنابراین می‌تواند حجم نامحدودی از داده‌ها را پردازش کند، اما هنگام ترکیب با گزینه‌های \fB\-\-keep\-order\fR، \&\fB\-\-results\fR، \fB\-\-compress\fR و \fB\-\-files\fR روی دیسک بافر خواهد کرد. این کار باعث می‌شود به کندی \&\fB\-\-group\fR شده و خروجی را به فضای دیسک در دسترس محدود کند. .Sp با گزینه \fB\-\-keep\-order\fR، گزینه \fB\-\-line\-buffer\fR در حین اجرای اولین کار، سطرهای آن را به‌طور پیوسته خروجی می‌دهد، سپس سطرهای کار دوم را هنگام اجرای آن چاپ می‌کند. این گزینه سطرهای کامل را بافر می‌کند اما خروجی کارها با هم مخلوط نمی‌شوند. مقایسه کنید: .Sp .Vb 3 \& parallel \-j0 \*(Aqecho [{};sleep {};echo {}]\*(Aq ::: 1 3 2 4 \& parallel \-j0 \-\-lb \*(Aqecho [{};sleep {};echo {}]\*(Aq ::: 1 3 2 4 \& parallel \-j0 \-k \-\-lb \*(Aqecho [{};sleep {};echo {}]\*(Aq ::: 1 3 2 4 .Ve .Sp همچنین ببینید: \fB\-\-group\fR \fB\-\-ungroup\fR \fB\-\-keep\-order\fR \fB\-\-tag\fR .IP \fB\-\-link\fR 4 .IX Item "--link" .PD 0 .IP \fB\-\-xapply\fR 4 .IX Item "--xapply" .PD پیوند دادن منابع ورودی. .Sp خواندن چندین منبع ورودی همانند دستور \fBxapply\fR. اگر چندین منبع ورودی مشخص شده باشد، از هر یک از منابع ورودی یک آرگومان خوانده خواهد شد. در دستور می‌توان به آرگومان‌ها به‌صورت \fB{1}\fR الی \fB{\fR\fIn\fR\fB}\fR دسترسی داشت؛ بنابراین \fB{1}\fR سطری از منبع ورودی اول خواهد بود و \fB{6}\fR به سطری با همان شماره سطر از ششمین منبع ورودی اشاره خواهد کرد. .Sp این دو را مقایسه کنید: .Sp .Vb 2 \& parallel echo {1} {2} ::: 1 2 3 ::: a b c \& parallel \-\-link echo {1} {2} ::: 1 2 3 ::: a b c .Ve .Sp اگر تعداد آرگومان‌های یک منبع ورودی بیشتر از بقیه باشد، آرگومان‌ها بازیافت (تکرار چرخشی) می‌شوند: .Sp .Vb 2 \& parallel \-\-link echo {1} {2} {3} \e \& ::: 1 2 ::: I II III ::: a b c d e f g .Ve .Sp همچنین ببینید: \fB\-\-header\fR \fB:::+\fR \fB::::+\fR .IP "\fB\-\-load\fR \fImax\-load\fR" 4 .IX Item "--load max-load" تنها در صورتی کارها را شروع کن که بار سیستم (load) کمتر از max\-load باشد. .Sp روی یک رایانه مشخص هیچ کار جدیدی را آغاز نکن مگر اینکه تعداد فرآیندهای در حال اجرا روی آن رایانه کمتر از \fImax\-load\fR باشد. مقدار \fImax\-load\fR از همان نحو نگارشی \&\fB\-\-jobs\fR استفاده می‌کند، بنابراین مقدار \fI100%\fR برای یک کار به ازای هر CPU تنظیمی معتبر است. تنها تفاوت مقدار 0 است که به عنوان 0.01 تفسیر می‌شود. .Sp همچنین ببینید: \fB\-\-limit\fR \fB\-\-jobs\fR .IP \fB\-\-controlmaster\fR 4 .IX Item "--controlmaster" .PD 0 .IP \fB\-M\fR 4 .IX Item "-M" .PD استفاده از ControlMaster در ssh برای بالا بردن سرعت اتصالات ssh. .Sp زمانی مفید است که کارها از راه دور (remote) اجرا می‌شوند و اجرای آن‌ها بسیار سریع است. این قابلیت برای sshloginهایی که دستور ssh سفارشی خود را مشخص کرده‌اند غیرفعال است. .Sp همچنین ببینید: \fB\-\-ssh\fR \fB\-\-sshlogin\fR .IP \fB\-m\fR 4 .IX Item "-m" چندین آرگومان. .Sp درج بیشترین تعداد آرگومان ممکن تا جایی که طول خط فرمان اجازه می‌دهد. اگر چندین کار به‌صورت موازی در حال اجرا باشند: آرگومان‌ها را به‌طور یکنواخت میان کارها توزیع کن. برای جلوگیری از این رفتار از \fB\-j1\fR یا \fB\-\-xargs\fR استفاده کنید. .Sp اگر از \fB{}\fR استفاده نشود، آرگومان‌ها به انتهای خط اضافه خواهند شد. اگر \fB{}\fR چندین بار استفاده شود، هر بار با تمام آرگومان‌ها جایگزین خواهد شد. .Sp پشتیبانی از \fB\-m\fR همراه با \fB\-\-sshlogin\fR محدود بوده و ممکن است با شکست مواجه شود. .Sp اگر تردید دارید از \fB\-X\fR استفاده کنید، زیرا به احتمال زیاد همان رفتار مورد نظر شما را فراهم می‌کند. .Sp همچنین ببینید: \fB\-X\fR \fB\-\-xargs\fR .IP "\fB\-\-match\fR \fIregexp\fR" 4 .IX Item "--match regexp" تطبیق منبع ورودی با regexp برای تنظیم فیلدهای جایگزینی. .Sp با گزینه \fB\-\-match\fR اغلب می‌توانید از پیش‌پردازش ورودی با \fBawk\fR یا ابزارهای مشابه برای استخراج فیلدهای مربوطه بی‌نیاز شوید. .Sp می‌توانید به هر گروه تطبیق (capture group)، یعنی پرانتزها در عبارت باقاعده \&\*(Aq(...)\*(Aq، با یک فیلد جایگزینی دسترسی پیدا کنید. فیلدهای جایگزینی به‌صورت \&\fB{m.n}\fR نام‌گذاری می‌شوند که در آن m شماره منبع ورودی و n شماره گروه تطبیق است: .Sp .Vb 4 \& parallel \-\-match \*(Aq(.*),(.*)_(.*)\*(Aq echo {1.2} {1.3} {1.1} \e \& ::: Gold,Heart_of \& parallel \-\-match \*(Aq(.*),\*(Aq \-\-match \*(Aq([a\-z]+)\*(Aq echo {1.1}{2.1} \e \& ::: Milli,bar ::: 10ways .Ve .Sp برای استفاده مجدد از یک \fB\-\-match\fR کافی است از \fB+n\fR استفاده کنید که n منبع ورودی است. برای مثال \fB+2\fR برای دومی: .Sp .Vb 2 \& parallel \-\-match +2 \-\-match \*(Aq([A\-Za\-z]+)\*(Aq echo {1.1} {2.1} \e \& ::: /Improbability/ ::: 10drive .Ve .Sp برای تنظیم \fB\-\-match\fR فقط برای منبع ورودی ۲، یک \fB\-\-match\fR صوری برای منبع ورودی ۱ بسازید: .Sp .Vb 2 \& parallel \-\-match \*(Aq\*(Aq \-\-match \*(Aq([a\-z]+)\*(Aq echo {1} {2.1} \e \& ::: Telephone ::: 10sanitizer .Ve .Sp همچنین ببینید: \fB{\fR\fIn\fR\fB}\fR \fB\-\-colsep\fR .IP "\fB\-\-memfree\fR \fIsize\fR" 4 .IX Item "--memfree size" حداقل حافظه آزاد هنگام شروع یک کار دیگر. .Sp مقدار \fIsize\fR می‌تواند با پسوندهای K، M، G، T، P، k، m، g، t یا p همراه باشد. .Sp اگر کارها مقادیر بسیار متفاوتی از RAM را مصرف کنند، GNU \fBparallel\fR فقط به تعدادی کار شروع می‌کند که حافظه برای آن‌ها موجود باشد. اگر کمتر از \fIsize\fR بایت آزاد باشد، هیچ کار جدیدی شروع نخواهد شد. اگر کمتر از 50% مقدار \fIsize\fR بایت آزاد باشد، جدیدترین کار (مطابق \fB\-\-term\-seq\fR) متوقف خواهد شد (killed) و دوباره به صف بازگردانده می‌شود تا بعداً اجرا شود. .Sp همچنین ببینید: UNIT PREFIX \fB\-\-term\-seq\fR \fB\-\-memsuspend\fR .IP "\fB\-\-memsuspend\fR \fIsize\fR" 4 .IX Item "--memsuspend size" معلق کردن کارها در صورت کاهش حافظه در دسترس. .Sp اگر حافظه در دسترس به کمتر از 2 * \fIsize\fR برسد، GNU \fBparallel\fR برخی از کارهای در حال اجرا را معلق (suspend) می‌کند. اگر حافظه در دسترس به کمتر از \&\fIsize\fR برسد، تنها یک کار در حال اجرا باقی خواهد ماند. .Sp اگر یک کار منفرد در اندازه مشخص‌شده جای گیرد، همه کارها بدون مواجه شدن با کمبود حافظه تکمیل خواهند شد. اگر فضای swap دارید، معمولاً می‌توانید \fIsize\fR را تا حدود نصف اندازه یک کار تکی کاهش دهید \- با ریسک اندکِ کمی استفاده از swap. .Sp با در دسترس قرار گرفتن RAM بیشتر \- معمولاً پس از اتمام قدیمی‌ترین کار \- کارها ادامه خواهند یافت (resume). .Sp گزینه \fB\-\-memsuspend\fR تنها برای کارهای محلی (local) کار می‌کند زیرا روش مشخصی برای معلق کردن کارهای راه دور (remote) وجود ندارد. .Sp مقدار \fIsize\fR می‌تواند با پسوندهای K، M، G، T، P، k، m، g، t یا p همراه باشد. .Sp همچنین ببینید: UNIT PREFIX \fB\-\-memfree\fR .IP "\fB\-\-milestone\fR \fIstr\fR" 4 .IX Item "--milestone str" تعیین نقاط عطف (milestones) که در آن‌ها تمام کارهای قبلی باید به پایان رسیده باشند. .Sp مثال: .Sp .Vb 9 \& doit() { \& start=$(date +%H:%M:%S) \& # Sleep up to 5 sec \& sleep $((RANDOM % 5000))e\-3 \& end=$(date +%H:%M:%S) \& echo Start: $start End: $end \& } \& export \-f doit \& parallel \-\-tag \-\-milestone // doit ::: a b c // 1 2 // A B // I II II .Ve .Sp این دستور دسته‌های (a, b, c)، (1, 2)، (A, B) و (I, II, III) را اجرا می‌کند. کارهای درون یک دسته به‌صورت موازی اجرا می‌شوند، اما دسته‌ها به‌صورت ترتیبی (سریال) اجرا خواهند شد. .Sp دقت کنید که چگونه زمان شروع هر دسته دیرتر از زمان پایان دسته قبلی است. .Sp مثال حاصل‌ضرب دکارتی: .Sp .Vb 1 \& parallel \-\-tag \-\-milestone // doit ::: Frist_run // Second_run ::: file{1..10} .Ve .Sp این دستور ابتدا First_run را با تمام فایل‌ها تکمیل می‌کند و سپس Second_run را روی تمام فایل‌ها آغاز می‌نماید. .Sp مثال دکارتی پیشرفته (دارای باگ): .Sp .Vb 1 \& parallel \-\-tag \-\-milestone // doit ::: a b // 1 2 3 ::: A B C // I II .Ve .Sp این دستور موارد زیر را اجرا می‌کند: [a] x [A B C], [a] x [I II], [b] x [A B C], [b] x [I II], [1] x [A B C], [1] x [I II], [2] x [A B C], [2] x [I II], [3] x [A B C], [3] x [I II] = (a A, a B, a C), (a I, a II), (b A, b B, b C), (b I, b II), (1 A, 1 B, 1 C), (1 I, 1 II), (2 A, 2 B, 2 C), (2 I, 2 II), (3 A, 3 B, 3 C), (3 I, 3 II). .Sp کارهای درون یک دسته به‌صورت موازی اجرا می‌شوند، اما دسته‌ها به‌صورت ترتیبی اجرا خواهند شد. .Sp زمانی که این باگ برطرف شود، به‌صورت زیر اجرا خواهد شد: [a b] x [A B C], [a b] x [I II], [1 2 3] x [A B C], [1 2 3] x [I II] = (a A, a B, a C, b A, b B, b C), (a I, a II, b I, b II), (1 A, 1 B, 1 C, 2 A, 2 B, 2 C, 3 A, 3 B, 3 C), (1 I, 1 II, 2 I, 2 II, 3 I, 3 II). .IP "\fB\-\-minversion\fR \fIversion\fR" 4 .IX Item "--minversion version" چاپ نسخه GNU \fBparallel\fR و خروج. .Sp اگر نسخه فعلی GNU \fBparallel\fR کمتر از \fIversion\fR باشد، کد خروج 255 است. در غیر این صورت 0 خواهد بود. .Sp این گزینه برای اسکریپت‌هایی مفید است که به ویژگی‌هایی وابسته هستند که فقط از نسخه خاصی از GNU \fBparallel\fR به بعد در دسترس است: .Sp .Vb 3 \& parallel \-\-minversion 20170422 && \& echo halt done=50% supported from version 20170422 && \& parallel \-\-halt now,done=50% echo ::: {1..100} .Ve .Sp همچنین ببینید: \fB\-\-version\fR .IP "\fB\-\-max\-args\fR \fImax\-args\fR" 4 .IX Item "--max-args max-args" .PD 0 .IP "\fB\-n\fR \fImax\-args\fR" 4 .IX Item "-n max-args" .PD استفاده از حداکثر \fImax\-args\fR آرگومان در هر خط فرمان. .Sp اگر از حد اندازه (گزینه \fB\-s\fR را ببینید) فراتر رود، آرگومان‌های کمتری از \fImax\-args\fR استفاده خواهد شد، مگر اینکه گزینه \fB\-x\fR داده شده باشد که در آن صورت GNU \fBparallel\fR خارج خواهد شد. .Sp مقدار \fB\-n 0\fR به معنای خواندن یک آرگومان اما درج 0 آرگومان در خط فرمان است. .Sp مقدار \fImax\-args\fR می‌تواند با پسوندهای K، M، G، T، P، k، m، g، t یا p همراه باشد (به UNIT PREFIX مراجعه کنید). .Sp به معنی فعال‌سازی خودکار \fB\-X\fR است، مگر اینکه \fB\-m\fR تنظیم شده باشد. .Sp همچنین ببینید: \fB\-X\fR \fB\-m\fR \fB\-\-xargs\fR \fB\-\-max\-replace\-args\fR .IP "\fB\-\-max\-replace\-args\fR \fImax\-args\fR" 4 .IX Item "--max-replace-args max-args" .PD 0 .IP "\fB\-N\fR \fImax\-args\fR" 4 .IX Item "-N max-args" .PD استفاده از حداکثر \fImax\-args\fR آرگومان در هر خط فرمان. .Sp مشابه \fB\-n\fR اما همچنین رشته‌های جایگزینی \fB{1}\fR الی \fB{\fR\fImax\-args\fR\fB}\fR را می‌سازد که بیانگر آرگومان‌های 1 الی \fImax\-args\fR هستند. اگر تعداد آرگومان‌ها کمتر باشد، \&\fB{\fR\fIn\fR\fB}\fR خالی خواهد بود. .Sp مقدار \fB\-N 0\fR به معنای خواندن یک آرگومان اما درج 0 آرگومان در خط فرمان است. .Sp این دستور مالک دایرکتوری خانگی (homedir) را روی کاربر تنظیم می‌کند: .Sp .Vb 1 \& tr \*(Aq:\*(Aq \*(Aq\en\*(Aq < /etc/passwd | parallel \-N7 chown {1} {6} .Ve .Sp به معنی فعال‌سازی خودکار \fB\-X\fR است، مگر اینکه \fB\-m\fR یا \fB\-\-pipe\fR تنظیم شده باشد. .Sp مقدار \fImax\-args\fR می‌تواند با پسوندهای K، M، G، T، P، k، m، g، t یا p همراه باشد. .Sp هنگام استفاده با \fB\-\-pipe\fR، مقدار \fB\-N\fR نشان‌دهنده تعداد رکوردهایی است که باید خوانده شوند. این حالت تا حدی کندتر از \fB\-\-block\fR است. .Sp همچنین ببینید: UNIT PREFIX \fB\-\-pipe\fR \fB\-\-block\fR \fB\-m\fR \fB\-X\fR \fB\-\-max\-args\fR .IP "\fB\-\-nonall\fR (آزمایشی آلفا)" 4 .IX Item "--nonall (alpha testing)" همان \fB\-\-onall\fR بدون آرگومان. .Sp دستور را روی تمام رایانه‌های مشخص‌شده با \fB\-\-sshlogin\fR اجرا می‌کند اما هیچ آرگومانی دریافت نمی‌کند. ابزار GNU \fBparallel\fR به تعداد مشخص‌شده در \fB\-\-jobs\fR رایانه به صورت موازی وارد می‌شود و کار را روی رایانه اجرا می‌کند. گزینه \fB\-j\fR تعداد رایانه‌هایی را که همزمان به آن‌ها وارد می‌شود تنظیم می‌کند. .Sp این گزینه برای اجرای یک دستور یکسان (مانند uptime) روی فهرستی از سرورها مفید است. .Sp همچنین ببینید: \fB\-\-onall\fR \fB\-\-sshlogin\fR .IP "\fB\-\-onall\fR (آزمایشی آلفا)" 4 .IX Item "--onall (alpha testing)" اجرای تمام کارها روی تمام رایانه‌های مشخص‌شده با \fB\-\-sshlogin\fR. .Sp ابزار GNU \fBparallel\fR به تعداد مشخص‌شده در \fB\-\-jobs\fR رایانه به صورت موازی وارد می‌شود و در هر رایانه یک کار را در هر لحظه اجرا می‌کند. ترتیب کارها تغییر نخواهد کرد، اما ممکن است برخی رایانه‌ها زودتر از بقیه کار را به پایان برسانند. .Sp هنگام استفاده از \fB\-\-group\fR، خروجی بر اساس هر سرور گروه‌بندی می‌شود، بنابراین تمام خروجی‌های حاصل از یک سرور در کنار هم قرار می‌گیرند. .Sp گزینه \fB\-\-joblog\fR شامل یک ورودی برای هر کار روی هر سرور خواهد بود، بنابراین چندین شماره توالی ۱ (job sequence 1) وجود خواهد داشت. .Sp همچنین ببینید: \fB\-\-nonall\fR \fB\-\-sshlogin\fR .IP \fB\-\-open\-tty\fR 4 .IX Item "--open-tty" .PD 0 .IP \fB\-o\fR 4 .IX Item "-o" .PD باز کردن tty ترمینال. .Sp مشابه \fB\-\-tty\fR است اما \fB\-\-jobs\fR یا \fB\-\-ungroup\fR را تنظیم نمی‌کند. .Sp همچنین ببینید: \fB\-\-tty\fR .IP \fB\-\-output\-as\-files\fR 4 .IX Item "--output-as-files" .PD 0 .IP \fB\-\-outputasfiles\fR 4 .IX Item "--outputasfiles" .IP \fB\-\-files\fR 4 .IX Item "--files" .IP \fB\-\-files0\fR 4 .IX Item "--files0" .PD ذخیره خروجی در فایل‌ها. .Sp به جای چاپ خروجی در stdout (خروجی استاندارد)، خروجی هر کار در یک فایل ذخیره شده و سپس نام فایل چاپ می‌شود. .Sp گزینه \fB\-\-files0\fR از NUL (\e0) به جای خط جدید (\en) به عنوان جداکننده استفاده می‌کند. .Sp همچنین ببینید: \fB\-\-results\fR .IP "\fB\-\-pipe\fR (آزمایشی بتا)" 4 .IX Item "--pipe (beta testing)" .PD 0 .IP "\fB\-\-spreadstdin\fR (آزمایشی بتا)" 4 .IX Item "--spreadstdin (beta testing)" .PD توزیع ورودی بین کارها از طریق stdin (ورودی استاندارد). .Sp یک بلوک از داده‌ها را از stdin (ورودی استاندارد) می‌خواند و آن را به عنوان ورودی به یک کار تحویل می‌دهد. .Sp اندازه بلوک توسط \fB\-\-block\fR تعیین می‌شود (پیش‌فرض: 1M). .Sp به جز اولین و آخرین رکورد، GNU \fBparallel\fR فقط رکوردهای کامل را به کار ارسال می‌کند. رشته‌های \fB\-\-recstart\fR و \fB\-\-recend\fR محل شروع و پایان یک رکورد را مشخص می‌کنند: مرز میان دو رکورد به صورت \fB\-\-recend\fR که بلافاصله پس از آن \fB\-\-recstart\fR آمده تعریف می‌شود. ابزار GNU \fBparallel\fR دقیقاً پس از \fB\-\-recend\fR و قبل از \fB\-\-recstart\fR عمل برش را انجام می‌دهد. آخرین رکورد ناقص قبل از تحویل بلوک به کار از آن حذف خواهد شد. این رکورد ناقص به ابتدای بلوک بعدی اضافه می‌شود. .Sp می‌توانید تعداد رکوردهای ارسالی را با \fB\-N\fR محدود کرده و اندازه رکورد را با \fB\-L\fR تعیین کنید. .Sp گزینه \fB\-\-pipe\fR حداکثر تا حدود ۱ گیگابایت بر ثانیه ورودی و ۱۰۰ مگابایت بر ثانیه خروجی را پوشش می‌دهد. اگر کارایی و سرعت بالا مهم است از \fB\-\-pipe\-part\fR استفاده کنید. .Sp گزینه‌های \fB\-\-fifo\fR و \fB\-\-cat\fR ورودی stdin (ورودی استاندارد) را روی یک fifo یا یک فایل موقت ارائه می‌دهند. .Sp اگر داده‌ها به آرامی می‌رسند، می‌توانید از \fB\-\-block\-timeout\fR برای پایان زودهنگام خواندن یک بلوک استفاده کنید. .Sp داده‌ها را می‌توان با استفاده از \fB\-\-round\-robin\fR، \fB\-\-bin\fR، \fB\-\-shard\fR و \fB\-\-group\-by\fR به روش‌های خاصی بین کارها توزیع کرد. به بخش توزیع بلوک‌های داده (SPREADING BLOCKS OF DATA) مراجعه کنید. .Sp همچنین ببینید: \fB\-\-block\fR \fB\-\-block\-timeout\fR \fB\-\-recstart\fR \fB\-\-recend\fR \&\fB\-\-fifo\fR \fB\-\-cat\fR \fB\-\-pipe\-part\fR \fB\-N\fR \fB\-L\fR \fB\-\-round\-robin\fR .IP "\fB\-\-pipe\-part\fR (آزمایشی آلفا)" 4 .IX Item "--pipe-part (alpha testing)" ارسال بخش‌هایی از یک فایل فیزیکی از طریق پایپ. .Sp گزینه \fB\-\-pipe\-part\fR عملکردی مشابه \fB\-\-pipe\fR دارد، اما بسیار سریع‌تر است. نرخ ۵ گیگابایت بر ثانیه را می‌توان به راحتی فراهم کرد. .Sp گزینه \fB\-\-pipe\-part\fR دارای چند محدودیت است: .RS 4 .IP \(bu 3 فایل باید یک فایل معمولی یا یک دستگاه بلوکی (از نظر فنی باید قابل جستجو/seekable) باشد و با استفاده از \fB\-\-arg\-file\fR یا \fB::::\fR ارائه شود. فایل نمی‌تواند یک پایپ، یک fifo یا یک جریان باشد زیرا آن‌ها قابل جستجو نیستند. .Sp در صورت استفاده از یک دستگاه بلوکی با تعداد زیادی بایت‌های NUL، فراموش نکنید که \fB\-\-recend \*(Aq\*(Aq\fR را تنظیم کنید. .IP \(bu 3 شمارش رکوردها (\fB\-N\fR) و شمارش خطوط (\fB\-L\fR/\fB\-l\fR) کار نمی‌کنند. در عوض از \fB\-\-recstart\fR و \fB\-\-recend\fR برای تعیین محل پایان رکوردها استفاده کنید. .RE .RS 4 .Sp همچنین ببینید: \fB\-\-pipe\fR \fB\-\-recstart\fR \fB\-\-recend\fR \fB\-\-arg\-file\fR \fB::::\fR .RE .IP \fB\-\-plain\fR 4 .IX Item "--plain" نادیده گرفتن \fB\-\-profile\fR، \f(CW$PARALLEL\fR و ~/.parallel/config. .Sp نادیده گرفتن هرگونه \fB\-\-profile\fR، \f(CW$PARALLEL\fR و ~/.parallel/config برای به دست آوردن کنترل کامل روی خط فرمان (توسط GNU \fBparallel\fR در هنگام فراخوانی داخلی با \fB\-\-sshlogin\fR استفاده می‌شود). .Sp \&\fBنکته امنیتی:\fR متغیر محیطی \f(CW$PARALLEL\fR به عنوان گزینه‌های اضافی خط فرمان تجزیه می‌شود، از جمله گزینه‌هایی که مقادیر آن‌ها به عنوان عبارات ارزیابی می‌شوند (مانند \fB\-\-blocksize\fR، \fB\-\-timeout\fR، \fB\-\-delay\fR). در بسترهای دارای دسترسی ویژه — اسکریپت‌های پوششی setuid، اسکریپت‌های sudo یا هر وضعیتی که \f(CW$PARALLEL\fR ممکن است توسط یک طرف با سطح اعتماد کمتر تنظیم شود — گزینه \fB\-\-plain\fR را پاس دهید تا از تأثیرگذاری \f(CW$PARALLEL\fR (و پروفایل‌های کاربری) بر فراخوانی جلوگیری شود. .Sp نمونه اسکریپت پوششی که به عنوان root اجرا می‌شود: .Sp .Vb 2 \& #!/bin/sh \& exec parallel \-\-plain "$@" .Ve .Sp همچنین ببینید: \fB\-\-profile\fR .IP \fB\-\-plus\fR 4 .IX Item "--plus" افزودن رشته‌های جایگزینی بیشتر. .Sp فعال‌سازی رشته‌های جایگزینی اضافی: {+/} {+.} {+..} {+...} {..} {...} {/..} {/...} {##}. ایده این است که \*(Aq{+foo}\*(Aq با نقطه مقابل \*(Aq{foo}\*(Aq مطابقت دارد، به طوری که: .Sp {} = {+/}/{/} = {.}.{+.} = {+/}/{/.}.{+.} = {..}.{+..} = {+/}/{/..}.{+..} = {...}.{+...} = {+/}/{/...}.{+...} .Sp \&\fB{##}\fR تعداد کل کارهایی است که باید اجرا شوند. این گزینه با \fB\-X\fR/\fB\-m\fR/\fB\-\-xargs\fR ناسازگار است. .Sp \&\fB{0%}\fR جایگاه کار (jobslot) با صفرهای ابتدایی (zero-padded). .Sp \&\fB{0#}\fR شماره توالی با صفرهای ابتدایی (zero-padded). .Sp \&\fB{slot\-1}\fR جایگاه کار \- ۱ (شمارش از ۰). .Sp \&\fB{seq\-1}\fR شماره توالی \- ۱ (شمارش از ۰). .Sp \&\fB{choose_k}\fR از مفهوم «انتخاب k از n» (n choose k) الهام گرفته شده است: با داشتن فهرستی از n عنصر، k عنصر انتخاب می‌شوند. k تعداد منابع ورودی و n تعداد آرگومان‌ها در یک منبع ورودی است. محتوای منابع ورودی باید یکسان باشد و آرگومان‌ها باید یکتا باشند. .Sp \&\fB{uniq}\fR کارهایی را که مقادیر دو منبع ورودی در آن‌ها یکسان است رد می‌کند. .Sp نام‌های کوتاه برای متغیرها: .Sp .Vb 5 \& {slot} $PARALLEL_JOBSLOT (see {%}) \& {sshlogin} $PARALLEL_SSHLOGIN \& {host} $PARALLEL_SSHHOST \& {agrp} $PARALLEL_ARGHOSTGROUPS \& {hgrp} $PARALLEL_HOSTGROUPS .Ve .Sp رشته‌های جایگزینی پویای زیر نیز فعال می‌شوند. این رشته‌ها از بسط پارامتر bash (parameter expansion) الهام گرفته شده‌اند: .Sp .Vb 10 \& {:\-str} str if the value is empty \& {:num} remove the first num characters \& {:pos:len} substring from position pos length len \& {#regexp} remove prefix regexp (non\-greedy) \& {##regexp} remove prefix regexp (greedy) \& {%regexp} remove postfix regexp (non\-greedy) \& {%%regexp} remove postfix regexp (greedy) \& {/regexp/str} replace one regexp with str \& {//regexp/str} replace every regexp with str \& {^str} uppercase str if found at the start \& {^^str} uppercase str \& {,str} lowercase str if found at the start \& {,,str} lowercase str .Ve .Sp همچنین ببینید: \fB\-\-rpl\fR \fB{}\fR .IP "\fB\-\-process\-slot\-var\fR \fIvarname\fR" 4 .IX Item "--process-slot-var varname" تنظیم متغیر محیطی \fIvarname\fR برابر با شماره جایگاه کار منهای یک (jobslot number\-1). .Sp .Vb 1 \& seq 10 | parallel \-\-process\-slot\-var=name echo \*(Aq$name\*(Aq {} .Ve .IP \fB\-\-progress\fR 4 .IX Item "--progress" نمایش پیشرفت محاسبات. .Sp رایانه‌های درگیر در وظیفه را همراه با تعداد پردازنده‌های شناسایی‌شده و حداکثر تعداد کارهای قابل اجرا فهرست می‌کند. پس از آن پیشرفت را برای هر رایانه نشان می‌دهد: تعداد کارهای در حال اجرا، تعداد کارهای تکمیل‌شده، و درصد تمام کارهای انجام‌شده توسط آن رایانه. درصد فقط پس از زمان‌بندی تمام کارها در دسترس خواهد بود، زیرا GNU \fBparallel\fR تنها زمانی کار بعدی را می‌خواند که آماده زمان‌بندی آن باشد — این کار برای جلوگیری از هدر رفتن زمان و حافظه با خواندن همه‌چیز در ابتدای اجرا است. .Sp با ارسال سیگنال SIGUSR2 به GNU \fBparallel\fR می‌توانید فعال/غیرفعال بودن \fB\-\-progress\fR را در یک فرآیند در حال اجرای GNU \fBparallel\fR تغییر وضعیت دهید. .Sp همچنین ببینید: \fB\-\-eta\fR \fB\-\-bar\fR \fB\-\-joblog\fR .IP \fB\-\-max\-line\-length\-allowed\fR 4 .IX Item "--max-line-length-allowed" چاپ حداکثر طول خط فرمان. .Sp حداکثر تعداد نویسه‌های مجاز در خط فرمان را چاپ کرده و خارج می‌شود (توسط خود GNU \fBparallel\fR برای تعیین طول خط در رایانه‌های راه دور استفاده می‌شود). .Sp همچنین ببینید: \fB\-\-show\-limits\fR .IP "\fB\-\-number\-of\-cpus\fR (منسوخ‌شده)" 4 .IX Item "--number-of-cpus (obsolete)" چاپ تعداد هسته‌های فیزیکی CPU و خروج. .IP \fB\-\-number\-of\-cores\fR 4 .IX Item "--number-of-cores" چاپ تعداد هسته‌های فیزیکی CPU و خروج (توسط خود GNU \fBparallel\fR برای تعیین تعداد هسته‌های فیزیکی CPU در رایانه‌های راه دور استفاده می‌شود). .Sp همچنین ببینید: \fB\-\-number\-of\-sockets\fR \fB\-\-number\-of\-threads\fR \&\fB\-\-use\-cores\-instead\-of\-threads\fR \fB\-\-jobs\fR .IP \fB\-\-number\-of\-sockets\fR 4 .IX Item "--number-of-sockets" چاپ تعداد سوکت‌های پرشده CPU و خروج (توسط خود GNU \fBparallel\fR برای تعیین تعداد سوکت‌های پرشده CPU در رایانه‌های راه دور استفاده می‌شود). .Sp همچنین ببینید: \fB\-\-number\-of\-cores\fR \fB\-\-number\-of\-threads\fR \&\fB\-\-use\-sockets\-instead\-of\-threads\fR \fB\-\-jobs\fR .IP \fB\-\-number\-of\-threads\fR 4 .IX Item "--number-of-threads" چاپ تعداد هسته‌های هایپرتریدینگ (hyperthreaded) CPU و خروج (توسط خود GNU \fBparallel\fR برای تعیین تعداد هسته‌های هایپرترید CPU در رایانه‌های راه دور استفاده می‌شود). .Sp همچنین ببینید: \fB\-\-number\-of\-cores\fR \fB\-\-number\-of\-sockets\fR \fB\-\-jobs\fR .IP \fB\-\-no\-keep\-order\fR 4 .IX Item "--no-keep-order" بازنویسی و نادیده گرفتن گزینه قبلی \fB\-\-keep\-order\fR (مثلاً اگر در \fB~/.parallel/config\fR تنظیم شده باشد). .IP "\fB\-\-nice\fR \fIniceness\fR" 4 .IX Item "--nice niceness" اجرای دستور با این اولویت (niceness). .Sp به صورت پیش‌فرض، GNU \fBparallel\fR کارها را با همان سطح nice که در هنگام شروع GNU \fBparallel\fR وجود داشته اجرا می‌کند — چه در رایانه محلی و چه در سرورهای راه دور، بنابراین بعید است که هرگز به این گزینه نیاز پیدا کنید. .Sp تنظیم \fB\-\-nice\fR این سطح nice را بازنویسی می‌کند. اگر سطح nice کمتر از سطح فعلی باشد، تنها بر کارهای راه دور تأثیر می‌گذارد (به عنوان مثال اگر سطح فعلی ۱۰ باشد، \fB\-\-nice 5\fR باعث می‌شود کارهای محلی در سطح ۱۰ اجرا شوند اما کارهای راه دور در سطح ۵ اجرا شوند). .IP \fB\-\-interactive\fR 4 .IX Item "--interactive" .PD 0 .IP \fB\-p\fR 4 .IX Item "-p" .PD پرسش از کاربر قبل از اجرای هر کار. .Sp در مورد اینکه آیا هر خط فرمان اجرا شود یا خیر از کاربر می‌پرسد و یک خط از ترمینال می‌خواند. خط فرمان تنها در صورتی اجرا می‌شود که پاسخ با \*(Aqy\*(Aq یا \*(AqY\*(Aq شروع شود. مستلزم گزینه \fB\-t\fR است. .IP "\fB\-\-_parset\fR \fItype\fR,\fIvarname\fR" 4 .IX Item "--_parset type,varname" به صورت داخلی توسط \fBparset\fR استفاده می‌شود. .Sp تولید کد شل برای اجرا با eval که متغیر(های) \fIvarname\fR را مقداردهی می‌کند. مقدار \fItype\fR می‌تواند \*(Aqassoc\*(Aq برای آرایه انجمنی یا \*(Aqvar\*(Aq برای متغیرهای عادی باشد. .Sp تنها کاربرد پشتیبانی‌شده به عنوان بخشی از ابزار \fBparset\fR است. .IP "\fB\-\-parens\fR \fIparensstring\fR" 4 .IX Item "--parens parensstring" استفاده از \fIparensstring\fR به جای \fB{==}\fR. .Sp تعریف پرانتزهای شروع و پایان برای \fB{=perl expression=}\fR. پرانتزهای چپ و راست می‌توانند چندکاراکتری باشند و فرض بر این است که طول یکسانی دارند. مقدار پیش‌فرض \fB{==}\fR است که \fB{=\fR را به عنوان پرانتز شروع و \fB=}\fR را به عنوان پرانتز پایان تعیین می‌کند. .Sp یک مقدار مفید دیگر \fB,,,,\fR است که هر دو پرانتز را \fB,,\fR قرار می‌دهد: .Sp .Vb 1 \& parallel \-\-parens ,,,, echo foo is ,,s/I/O/g,, ::: FII .Ve .Sp همچنین ببینید: \fB\-\-rpl\fR \fB{=\fR\fIperl expression\fR\fB=}\fR .IP "\fB\-\-profile\fR \fIprofilename\fR" 4 .IX Item "--profile profilename" .PD 0 .IP "\fB\-J\fR \fIprofilename\fR" 4 .IX Item "-J profilename" .PD استفاده از پروفایل \fIprofilename\fR برای گزینه‌ها. .Sp این گزینه زمانی مفید است که بخواهید چندین پروفایل داشته باشید. می‌توانید یک پروفایل برای اجرای کارها به صورت موازی در رایانه محلی و یک پروفایل دیگر برای اجرای کارها در رایانه‌های راه دور داشته باشید. .Sp شناسه \fIprofilename\fR متناظر با فایل ~/.parallel/\fIprofilename\fR است. .Sp می‌توانید با تکرار \fB\-\-profile\fR چندین پروفایل را مشخص کنید. اگر بخش‌هایی از پروفایل‌ها با یکدیگر تداخل داشته باشند، اولویت با موارد بعدی خواهد بود. .Sp پیش‌فرض: ~/.parallel/config .Sp همچنین ببینید: فایل‌های پروفایل (PROFILE FILES) .IP \fB\-\-quote\fR 4 .IX Item "--quote" .PD 0 .IP \fB\-q\fR 4 .IX Item "-q" .PD نقل‌قول کردن و اسکیپ \fIcommand\fR. .Sp اگر دستور شما شامل نویسه‌های خاصی است که نباید توسط پوسته تفسیر شوند (مانند ; \e | *)، از \fB\-\-quote\fR برای اسکیپ کردن آن‌ها استفاده کنید. دستور باید یک دستور ساده باشد (به \fBman bash\fR مراجعه کنید) بدون تغییرمسیرها (redirections) و بدون انتساب متغیرها. .Sp اکثر افراد به این گزینه نیازی نخواهند داشت. نقل‌قول کردن به صورت پیش‌فرض غیرفعال است. .Sp همچنین ببینید: نقل‌قول (QUOTING) \fIcommand\fR \fB\-\-shell\-quote\fR \fBuq()\fR \fBQ()\fR.IP \fB\-\-no\-run\-if\-empty\fR 4 .IX Item "--no-run-if-empty" .PD 0 .IP \fB\-r\fR 4 .IX Item "-r" .PD عدم اجرای ورودی خالی. .Sp اگر ورودی استاندارد (stdin) فقط شامل نویسه‌های فاصله خالی (whitespace) باشد، دستور را اجرا نمی‌کند. .Sp در صورت استفاده همراه با \fB\-\-pipe\fR این فرایند کند خواهد بود. .Sp همچنین ببینید: \fIcommand\fR \fB\-\-pipe\fR \fB\-\-interactive\fR .IP \fB\-\-noswap\fR 4 .IX Item "--noswap" اگر رایانه در حال تعویض حافظه (swap) باشد کار جدیدی را آغاز نمی‌کند. .Sp اگر روی یک رایانه مشخص هم‌زمان فعالیت ورود به حافظه مجازی (swap\-in) و خروج از آن (swap\-out) وجود داشته باشد، کارهای جدید را روی آن آغاز نمی‌کند. .Sp فعالیت swap فقط هر ۱۰ ثانیه یک‌بار نمونه‌برداری می‌شود زیرا انجام نمونه‌برداری ۱ ثانیه زمان می‌برد. .Sp فعالیت swap به‌صورت (swap\-in)*(swap\-out) محاسبه می‌شود که در عمل مقدار مناسبی است: swap\-out مشکلی ندارد، swap\-in مشکلی ندارد، اما وجود هم‌زمان هر دو حالت swap\-in و swap\-out معمولاً نشان‌دهندهٔ یک مشکل است. .Sp گزینه‌های \fB\-\-memfree\fR و \fB\-\-memsuspend\fR ممکن است نتایج بهتری ارائه دهند، بنابراین ابتدا استفاده از آن‌ها را امتحان کنید. .Sp همچنین ببینید: \fB\-\-memfree\fR \fB\-\-memsuspend\fR .IP \fB\-\-record\-env\fR 4 .IX Item "--record-env" ثبت متغیرهای محیطی صادرشده. .Sp متغیرهای محیطی صادرشدهٔ (exported) فعلی را در \fB~/.parallel/ignored_vars\fR ثبت می‌کند. این کار باعث نادیده گرفتن متغیرهای تنظیم‌شدهٔ فعلی هنگام استفاده از \fB\-\-env _\fR می‌شود. بنابراین باید متغیرها/توابعی را که می‌خواهید استفاده کنید \fIپس از\fR اجرای \fB\-\-record\-env\fR تنظیم نمایید. .Sp همچنین ببینید: \fB\-\-env\fR \fB\-\-session\fR \fBenv_parallel\fR .IP "\fB\-\-recstart\fR \fIstartstring\fR" 4 .IX Item "--recstart startstring" .PD 0 .IP "\fB\-\-recend\fR \fIendstring\fR" 4 .IX Item "--recend endstring" .PD تفکیک رکورد بین \fIendstring\fR و \fIstartstring\fR. .Sp اگر \fB\-\-recstart\fR مشخص شود، از \fIstartstring\fR برای تفکیک در ابتدای رکورد استفاده می‌شود. .Sp اگر \fB\-\-recend\fR مشخص شود، از \fIendstring\fR برای تفکیک در انتهای رکورد استفاده می‌شود. .Sp اگر هر دو گزینهٔ \fB\-\-recstart\fR و \fB\-\-recend\fR مشخص شوند، رشتهٔ ترکیبی \fIendstring\fR\fIstartstring\fR باید مطابقت داشته باشد تا موقعیت تفکیک پیدا شود. این ویژگی زمانی مفید است که \fIstartstring\fR یا \fIendstring\fR در میانهٔ یک رکورد مطابقت پیدا کنند. .Sp اگر هیچ‌کدام از \fB\-\-recstart\fR یا \fB\-\-recend\fR مشخص نشوند، مقدار پیش‌فرض \fB\-\-recend\fR برابر \*(Aq\en\*(Aq خواهد بود. برای نداشتن جداکنندهٔ رکورد (مثلاً برای فایل‌های باینری) از \fB\-\-recend ""\fR استفاده کنید. .Sp گزینه‌های \fB\-\-recstart\fR و \fB\-\-recend\fR همراه با \fB\-\-pipe\fR استفاده می‌شوند. .Sp از \fB\-\-regexp\fR برای تفسیر \fB\-\-recstart\fR و \fB\-\-recend\fR به‌عنوان عبارات باقاعده (regular expressions) استفاده کنید. با این حال، این کار کند است. .Sp برای حذف \fB\-\-recstart\fR و \fB\-\-recend\fR پیش از ارسال بلوک به کار، از \fB\-\-remove\-rec\-sep\fR استفاده کنید. .Sp همچنین ببینید: \fB\-\-pipe\fR \fB\-\-regexp\fR \fB\-\-remove\-rec\-sep\fR .IP \fB\-\-regexp\fR 4 .IX Item "--regexp" از \fB\-\-regexp\fR برای تفسیر \fB\-\-recstart\fR و \fB\-\-recend\fR به‌عنوان عبارات باقاعده (regular expressions) استفاده کنید. با این حال، این کار کند است. .Sp همچنین ببینید: \fB\-\-pipe\fR \fB\-\-regexp\fR \fB\-\-remove\-rec\-sep\fR \fB\-\-recstart\fR \fB\-\-recend\fR .IP \fB\-\-remove\-rec\-sep\fR 4 .IX Item "--remove-rec-sep" .PD 0 .IP \fB\-\-removerecsep\fR 4 .IX Item "--removerecsep" .IP \fB\-\-rrs\fR 4 .IX Item "--rrs" .PD حذف جداکننده رکورد. .Sp متن منطبق‌شده با \fB\-\-recstart\fR و \fB\-\-recend\fR را پیش از پایپ کردن به دستور حذف می‌کند. .Sp فقط همراه با \fB\-\-pipe\fR/\fB\-\-pipe\-part\fR استفاده می‌شود. .Sp همچنین ببینید: \fB\-\-pipe\fR \fB\-\-regexp\fR \fB\-\-pipe\-part\fR \fB\-\-recstart\fR \fB\-\-recend\fR .IP "\fB\-\-results\fR \fIname\fR" 4 .IX Item "--results name" .PD 0 .IP "\fB\-\-res\fR \fIname\fR" 4 .IX Item "--res name" .PD ذخیره خروجی در فایل‌ها. .Sp \&\fBدایرکتوری خروجی با رشته ساده\fR .Sp اگر \fIname\fR فاقد رشته‌های جایگزینی باشد و به \fB.csv/.tsv\fR ختم نشود، خروجی در یک ساختار درختی دایرکتوری با ریشهٔ \fIname\fR ذخیره خواهد شد. درون این ساختار درختی، هر دستور منجر به سه فایل می‌شود: \fIname\fR//stdout و \fIname\fR//stderr و \fIname\fR//seq، که در آن دنباله‌ای از دایرکتوری‌ها است که سربرگ منبع ورودی (در صورت استفاده از \fB\-\-header :\fR) یا شمارهٔ منبع ورودی و مقادیر متناظر آن را نشان می‌دهد. .Sp برای مثال: .Sp .Vb 2 \& parallel \-\-header : \-\-results foo echo {a} {b} \e \& ::: a I II ::: b III IIII .Ve .Sp فایل‌های زیر را تولید خواهد کرد: .Sp .Vb 12 \& foo/a/II/b/III/seq \& foo/a/II/b/III/stderr \& foo/a/II/b/III/stdout \& foo/a/II/b/IIII/seq \& foo/a/II/b/IIII/stderr \& foo/a/II/b/IIII/stdout \& foo/a/I/b/III/seq \& foo/a/I/b/III/stderr \& foo/a/I/b/III/stdout \& foo/a/I/b/IIII/seq \& foo/a/I/b/IIII/stderr \& foo/a/I/b/IIII/stdout .Ve .Sp و .Sp .Vb 1 \& parallel \-\-results foo echo {1} {2} ::: I II ::: III IIII .Ve .Sp فایل‌های زیر را تولید خواهد کرد: .Sp .Vb 12 \& foo/1/II/2/III/seq \& foo/1/II/2/III/stderr \& foo/1/II/2/III/stdout \& foo/1/II/2/IIII/seq \& foo/1/II/2/IIII/stderr \& foo/1/II/2/IIII/stdout \& foo/1/I/2/III/seq \& foo/1/I/2/III/stderr \& foo/1/I/2/III/stdout \& foo/1/I/2/IIII/seq \& foo/1/I/2/IIII/stderr \& foo/1/I/2/IIII/stdout .Ve .Sp \&\fBخروجی فایل CSV\fR .Sp اگر \fIname\fR به \fB.csv\fR/\fB.tsv\fR ختم شود، خروجی یک فایل CSV به نام \fIname\fR خواهد بود. .Sp پسوند \fB.csv\fR یک فایل با مقادیر جداشده با کاما و \fB.tsv\fR یک فایل با مقادیر جداشده با TAB ارائه می‌دهد. .Sp مقادیر \fB\-.csv\fR/\fB\-.tsv\fR حالت خاص هستند: فایل را روی خروجی استاندارد (stdout) ارائه می‌دهند. .Sp \&\fBخروجی فایل JSON\fR .Sp اگر \fIname\fR به \fB.json\fR ختم شود، خروجی یک فایل JSON به نام \fIname\fR خواهد بود. .Sp مقدار \fB\-.json\fR حالت خاص است: فایل را روی خروجی استاندارد (stdout) ارائه می‌دهد. .Sp \&\fBفایل خروجی با رشته جایگزینی\fR .Sp اگر \fIname\fR حاوی یک رشتهٔ جایگزینی باشد و نتیجهٔ جایگزین‌شده به / ختم نشود، خروجی استاندارد در فایلی با نام این نتیجه ذخیره می‌شود. خطای استاندارد در همان نام فایل همراه با \*(Aq.err\*(Aq اضافه شده و شمارهٔ توالی در همان نام فایل با \*(Aq.seq\*(Aq اضافه شده ذخیره خواهد شد. .Sp برای مثال: .Sp .Vb 1 \& parallel \-\-results my_{} echo ::: foo bar baz .Ve .Sp فایل‌های زیر را تولید خواهد کرد: .Sp .Vb 9 \& my_bar \& my_bar.err \& my_bar.seq \& my_baz \& my_baz.err \& my_baz.seq \& my_foo \& my_foo.err \& my_foo.seq .Ve .Sp \&\fBدایرکتوری خروجی با رشته جایگزینی\fR .Sp اگر \fIname\fR حاوی یک رشتهٔ جایگزینی باشد و نتیجهٔ جایگزین‌شده به / ختم شود، فایل‌های خروجی در دایرکتوری حاصل ذخیره خواهند شد. .Sp برای مثال: .Sp .Vb 1 \& parallel \-\-results my_{}/ echo ::: foo bar baz .Ve .Sp فایل‌های زیر را تولید خواهد کرد: .Sp .Vb 9 \& my_bar/seq \& my_bar/stderr \& my_bar/stdout \& my_baz/seq \& my_baz/stderr \& my_baz/stdout \& my_foo/seq \& my_foo/stderr \& my_foo/stdout .Ve .Sp همچنین ببینید: \fB\-\-output\-as\-files\fR \fB\-\-tag\fR \fB\-\-header\fR \fB\-\-joblog\fR .IP \fB\-\-resume\fR 4 .IX Item "--resume" از سرگیری از آخرین کار ناتمام. .Sp با خواندن \fB\-\-joblog\fR یا دایرکتوری \fB\-\-results\fR، گنو \fBparallel\fR آخرین کار ناتمام را تشخیص داده و از همان‌جا ادامه می‌دهد. از آنجا که گنو \fBparallel\fR فقط به شماره‌های توالی در \fB\-\-joblog\fR نگاه می‌کند، ورودی، دستور و \fB\-\-joblog\fR همگی باید بدون تغییر باقی بمانند؛ در غیر این صورت ممکن است گنو \fBparallel\fR دستورات نادرستی را اجرا کند. .Sp همچنین ببینید: \fB\-\-joblog\fR \fB\-\-results\fR \fB\-\-resume\-failed\fR \fB\-\-retries\fR .IP \fB\-\-resume\-failed\fR 4 .IX Item "--resume-failed" تلاش مجدد برای تمام موارد ناموفق و از سرگیری از آخرین کار ناتمام. .Sp با خواندن \fB\-\-joblog\fR، گنو \fBparallel\fR کارهای ناموفق را تشخیص داده و آن‌ها را مجدداً اجرا می‌کند. پس از آن، از آخرین کار ناتمام از سر گرفته و ادامه می‌دهد. از آنجا که گنو \fBparallel\fR فقط به شماره‌های توالی در \fB\-\-joblog\fR نگاه می‌کند، ورودی، دستور و \fB\-\-joblog\fR همگی باید بدون تغییر باقی بمانند؛ در غیر این صورت ممکن است گنو \fBparallel\fR دستورات نادرستی را اجرا کند. .Sp همچنین ببینید: \fB\-\-joblog\fR \fB\-\-resume\fR \fB\-\-retry\-failed\fR \fB\-\-retries\fR .IP \fB\-\-retry\-failed\fR 4 .IX Item "--retry-failed" تلاش مجدد برای تمام کارهای ناموفق در joblog. .Sp با خواندن \fB\-\-joblog\fR، گنو \fBparallel\fR کارهای ناموفق را تشخیص داده و آن‌ها را مجدداً اجرا می‌کند. .Sp گزینهٔ \fB\-\-retry\-failed\fR دستور و آرگومان‌های روی خط فرمان را نادیده می‌گیرد: این گزینه فقط به joblog نگاه می‌کند. .Sp \&\fBتفاوت‌های میان \-\-resume و \-\-resume\-failed و \-\-retry\-failed\fR .Sp در این مثال، عبارت \fBexit {= \fR\f(CB$_\fR\fB%=2 =}\fR باعث شکست یکی‌درمیان کارها می‌شود. .Sp .Vb 2 \& timeout \-k 1 4 parallel \-\-joblog log \-j10 \e \& \*(Aqsleep {}; exit {= $_%=2 =}\*(Aq ::: {10..1} .Ve .Sp ۴ کار کامل شد، ۲ کار با شکست مواجه شد: .Sp .Vb 5 \& Seq [...] Exitval Signal Command \& 10 [...] 1 0 sleep 1; exit 1 \& 9 [...] 0 0 sleep 2; exit 0 \& 8 [...] 1 0 sleep 3; exit 1 \& 7 [...] 0 0 sleep 4; exit 0 .Ve .Sp گزینهٔ \fB\-\-resume\fR به Exitval اهمیتی نمی‌دهد و فقط به Seq نگاه می‌کند. اگر یک Seq اجرا شده باشد، دوباره اجرا نخواهد شد. بنابراین در صورت نیاز می‌توانید دستور را برای دنباله‌هایی که هنوز اجرا نشده‌اند تغییر دهید: .Sp .Vb 2 \& parallel \-\-resume \-\-joblog log \-j10 \e \& \*(Aqsleep .{}; exit {= $_%=2 =}\*(Aq ::: {10..1} \& \& Seq [...] Exitval Signal Command \& [... as above ...] \& 1 [...] 0 0 sleep .10; exit 0 \& 6 [...] 1 0 sleep .5; exit 1 \& 5 [...] 0 0 sleep .6; exit 0 \& 4 [...] 1 0 sleep .7; exit 1 \& 3 [...] 0 0 sleep .8; exit 0 \& 2 [...] 1 0 sleep .9; exit 1 .Ve .Sp گزینهٔ \fB\-\-resume\-failed\fR به Exitval توجه دارد، اما برای تشخیص دستوراتی که باید اجرا شوند باز هم فقط به Seq نگاه می‌کند. این یعنی مجدداً می‌توانید خود دستور را تغییر دهید، اما آرگومان‌ها را خیر. این گزینه دنباله‌های ناموفق و دنباله‌هایی را که هنوز اجرا نشده‌اند اجرا خواهد کرد: .Sp .Vb 2 \& parallel \-\-resume\-failed \-\-joblog log \-j10 \e \& \*(Aqecho {};sleep .{}; exit {= $_%=3 =}\*(Aq ::: {10..1} \& \& Seq [...] Exitval Signal Command \& [... as above ...] \& 10 [...] 1 0 echo 1;sleep .1; exit 1 \& 8 [...] 0 0 echo 3;sleep .3; exit 0 \& 6 [...] 2 0 echo 5;sleep .5; exit 2 \& 4 [...] 1 0 echo 7;sleep .7; exit 1 \& 2 [...] 0 0 echo 9;sleep .9; exit 0 .Ve .Sp گزینهٔ \fB\-\-retry\-failed\fR به Exitval توجه دارد، اما دستور را از joblog برمی‌دارد. این گزینه هرگونه آرگومان یا دستور داده‌شده روی خط فرمان را نادیده می‌گیرد: .Sp .Vb 1 \& parallel \-\-retry\-failed \-\-joblog log \-j10 this part is ignored \& \& Seq [...] Exitval Signal Command \& [... as above ...] \& 10 [...] 1 0 echo 1;sleep .1; exit 1 \& 6 [...] 2 0 echo 5;sleep .5; exit 2 \& 4 [...] 1 0 echo 7;sleep .7; exit 1 .Ve .Sp همچنین ببینید: \fB\-\-joblog\fR \fB\-\-resume\fR \fB\-\-resume\-failed\fR \fB\-\-retries\fR .IP "\fB\-\-retries\fR \fIn\fR (beta testing)" 4 .IX Item "--retries n (beta testing)" تلاش مجدد برای کارهای ناموفق تا \fIn\fR بار. .Sp اگر کاری با شکست مواجه شود، تلاش مجدد را روی رایانهٔ دیگری که در آن شکست نخورده انجام می‌دهد. این کار را \fIn\fR بار تکرار می‌کند. اگر تعداد رایانه‌های موجود در \fB\-\-sshlogin\fR کمتر از \fIn\fR باشد، گنو \fBparallel\fR دوباره از همهٔ رایانه‌ها استفاده خواهد کرد. این ویژگی زمانی مفید است که برخی کارها بدون دلیل مشخصی (مانند نقص شبکه) شکست می‌خورند. .Sp مقدار \fIn\fR=0 به معنای نامحدود است. .Sp همچنین ببینید: \fB\-\-term\-seq\fR \fB\-\-sshlogin\fR .IP "\fB\-\-return\fR \fIfilename\fR (beta testing)" 4 .IX Item "--return filename (beta testing)" انتقال فایل‌ها از رایانه‌های دوردست. .Sp گزینه \&\fB\-\-return\fR همراه با \&\fB\-\-sshlogin\fR زمانی استفاده می‌شود که آرگومان‌ها فایل‌هایی روی رایانه‌های دوردست باشند. پس از اتمام پردازش، فایل \fIfilename\fR با استفاده از \fBrsync\fR از رایانه دوردست منتقل شده و به صورت نسبی در دایرکتوری ورود پیش‌فرض قرار می‌گیرد. به عنوان مثال: .Sp .Vb 2 \& echo foo/bar.txt | parallel \-\-return {.}.out \e \& \-\-sshlogin server.example.com touch {.}.out .Ve .Sp این دستور فایل \fR\f(CI$HOME\fR\fI/foo/bar.out\fR را از رایانه \&\fIserver.example.com\fR پس از اجرای \&\fBtouch foo/bar.out\fR روی \fIserver.example.com\fR به فایل \fIfoo/bar.out\fR منتقل خواهد کرد. .Sp .Vb 1 \& parallel \-S server \-\-trc out/./{}.out touch {}.out ::: in/file .Ve .Sp این دستور فایل \fIin/file.out\fR را از رایانه \&\fIserver.example.com\fR پس از اجرای \&\fBtouch in/file.out\fR روی \fIserver\fR به فایل‌های \fIout/in/file.out\fR منتقل خواهد کرد. .Sp .Vb 2 \& echo /tmp/foo/bar.txt | parallel \-\-return {.}.out \e \& \-\-sshlogin server.example.com touch {.}.out .Ve .Sp این دستور فایل \fI/tmp/foo/bar.out\fR را از رایانه \&\fIserver.example.com\fR پس از اجرای \&\fBtouch /tmp/foo/bar.out\fR روی \fIserver.example.com\fR به فایل \fI/tmp/foo/bar.out\fR منتقل خواهد کرد. .Sp با تکرار چندباره این گزینه می‌توان چندین فایل را منتقل کرد: .Sp .Vb 3 \& echo /tmp/foo/bar.txt | parallel \e \& \-\-sshlogin server.example.com \e \& \-\-return {.}.out \-\-return {.}.out2 touch {.}.out {.}.out2 .Ve .Sp در صورت استفاده با \fB\-\-sshlogin :\fR یا هنگام عدم استفاده همراه با \&\fB\-\-sshlogin\fR، گزینه \fB\-\-return\fR نادیده گرفته می‌شود. .Sp برای جزئیات بیشتر در مورد انتقال، \fB\-\-transferfile\fR را ببینید. .Sp همچنین ببینید: \fB\-\-transfer\fR \fB\-\-transferfile\fR \fB\-\-sshlogin\fR \fB\-\-cleanup\fR \&\fB\-\-workdir\fR .IP "\fB\-\-round\-robin\fR (alpha testing)" 4 .IX Item "--round-robin (alpha testing)" .PD 0 .IP "\fB\-\-round\fR (alpha testing)" 4 .IX Item "--round (alpha testing)" .PD توزیع تکه‌های ورودی استاندارد به شیوه نوبت‌گردشی (round robin). .Sp به طور معمول \fB\-\-pipe\fR به هر نمونه از دستور یک بلوک می‌دهد. با \fB\-\-round\-robin\fR تمام بلوک‌ها به صورت تصادفی به دستوراتی که از قبل در حال اجرا هستند نوشته می‌شوند. این قابلیت زمانی مفید است که مقداردهی اولیه دستور زمان زیادی ببرد. .Sp در صورت استفاده از \fB\-\-keep\-order\fR و \fB\-\-round\-robin\fR، اگر ورودی یکسان نگه داشته شود، اسلات‌های کار در هر بار اجرا همان بلوک‌ها را با همان ترتیب به عنوان ورودی دریافت خواهند کرد. جزئیات بیشتر را ذیل \fB\-\-keep\-order\fR ببینید. .Sp گزینه \fB\-\-round\-robin\fR مستلزم \fB\-\-pipe\fR است، مگر اینکه \fB\-\-pipe\-part\fR داده شده باشد. .Sp بخش SPREADING BLOCKS OF DATA را ببینید. .Sp همچنین ببینید: \fB\-\-bin\fR \fB\-\-group\-by\fR \fB\-\-shard\fR .IP "\fB\-\-rpl\fR \*(Aq\fItag\fR \fIperl expression\fR\*(Aq" 4 .IX Item "--rpl 'tag perl expression'" تعریف رشته جایگزین. .Sp استفاده از \fItag\fR به عنوان رشته جایگزین برای \fIperl expression\fR. این امکان را فراهم می‌سازد که رشته‌های جایگزین سفارشی خود را تعریف کنید. ۷ رشته جایگزین در GNU \fBparallel\fR به این صورت پیاده‌سازی شده‌اند: .Sp .Vb 8 \& \-\-rpl \*(Aq{} \*(Aq \& \-\-rpl \*(Aq{#} 1 $_=$job\->seq()\*(Aq \& \-\-rpl \*(Aq{%} 1 $_=$job\->slot()\*(Aq \& \-\-rpl \*(Aq{/} s:.*/::\*(Aq \& \-\-rpl \*(Aq{//} $Global::use{"File::Basename"} ||= \& eval "use File::Basename; 1;"; $_ = dirname($_);\*(Aq \& \-\-rpl \*(Aq{/.} s:.*/::; s:\e.[^/.]+$::;\*(Aq \& \-\-rpl \*(Aq{.} s:\e.[^/.]+$::\*(Aq .Ve .Sp رشته‌های جایگزین \fB\-\-plus\fR به این صورت پیاده‌سازی شده‌اند: .Sp .Vb 10 \& \-\-rpl \*(Aq{+/} s:/[^/]*$:: || s:.*$::\*(Aq \& \-\-rpl \*(Aq{+.} s:.*\e.:: || s:.*$::\*(Aq \& \-\-rpl \*(Aq{+..} s:.*\e.([^/.]+\e.[^/.]+)$:$1: || s:.*$::\*(Aq \& \-\-rpl \*(Aq{+...} s:.*\e.([^/.]+\e.[^/.]+\e.[^/.]+)$:$1: || s:.*$::\*(Aq \& \-\-rpl \*(Aq{..} s:\e.[^/.]+\e.[^/.]+$::\*(Aq \& \-\-rpl \*(Aq{...} s:\e.[^/.]+\e.[^/.]+\e.[^/.]+$::\*(Aq \& \-\-rpl \*(Aq{/..} s:.*/::; s:\e.[^/.]+\e.[^/.]+$::\*(Aq \& \-\-rpl \*(Aq{/...} s:.*/::; s:\e.[^/.]+\e.[^/.]+\e.[^/.]+$::\*(Aq \& \-\-rpl \*(Aq{choose_k} \& for $t (2..$#arg){ if($arg[$t\-1] ge $arg[$t]) { skip() } }\*(Aq \& \-\-rpl \*(Aq{##} 1 $_=total_jobs()\*(Aq \& \-\-rpl \*(Aq{0%} 1 $f=1+int((log($Global::max_jobs_running||1)/ \& log(10))); $_=sprintf("%0${f}d",slot())\*(Aq \& \-\-rpl \*(Aq{0#} 1 $f=1+int((log(total_jobs())/log(10))); \& $_=sprintf("%0${f}d",seq())\*(Aq \& \-\-rpl \*(Aq{seq(.*?)} $_=eval q{$job\->seq()}.qq{$$1}\*(Aq \& \-\-rpl \*(Aq{slot(.*?)} $_=eval q{$job\->slot()}.qq{$$1}\*(Aq \& \& \-\-rpl \*(Aq{:\-([^}]+?)} $_ ||= $$1\*(Aq \& \-\-rpl \*(Aq{:(\ed+?)} substr($_,0,$$1) = ""\*(Aq \& \-\-rpl \*(Aq{:(\ed+?):(\ed+?)} $_ = substr($_,$$1,$$2);\*(Aq \& \-\-rpl \*(Aq{#([^#}][^}]*?)} $nongreedy=::make_regexp_ungreedy($$1); \& s/^$nongreedy(.*)/$1/;\*(Aq \& \-\-rpl \*(Aq{##([^#}][^}]*?)} s/^$$1//;\*(Aq \& \-\-rpl \*(Aq{%([^}]+?)} $nongreedy=::make_regexp_ungreedy($$1); \& s/(.*)$nongreedy$/$1/;\*(Aq \& \-\-rpl \*(Aq{%%([^}]+?)} s/$$1$//;\*(Aq \& \-\-rpl \*(Aq{/([^}]+?)/([^}]*?)} s/$$1/$$2/;\*(Aq \& \-\-rpl \*(Aq{^([^}]+?)} s/^($$1)/uc($1)/e;\*(Aq \& \-\-rpl \*(Aq{^^([^}]+?)} s/($$1)/uc($1)/eg;\*(Aq \& \-\-rpl \*(Aq{,([^}]+?)} s/^($$1)/lc($1)/e;\*(Aq \& \-\-rpl \*(Aq{,,([^}]+?)} s/($$1)/lc($1)/eg;\*(Aq \& \& \-\-rpl \*(Aq{slot} 1 $_="\e${PARALLEL_JOBSLOT}";uq()\*(Aq \& \-\-rpl \*(Aq{host} 1 $_="\e${PARALLEL_SSHHOST}";uq()\*(Aq \& \-\-rpl \*(Aq{sshlogin} 1 $_="\e${PARALLEL_SSHLOGIN}";uq()\*(Aq \& \-\-rpl \*(Aq{hgrp} 1 $_="\e${PARALLEL_HOSTGROUPS}";uq()\*(Aq \& \-\-rpl \*(Aq{agrp} 1 $_="\e${PARALLEL_ARGHOSTGROUPS}";uq()\*(Aq .Ve .Sp اگر رشته جایگزین تعریف‌شده توسط کاربر با \*(Aq{\*(Aq آغاز شود، می‌تواند به عنوان یک رشته جایگزین موضعی (مانند \fB{2.}\fR) نیز استفاده شود. .Sp توصیه می‌شود تنها \f(CW$_\fR را تغییر دهید، اما به تمام توابع و ساختارهای داده داخلی GNU \fBparallel\fR دسترسی کامل دارید. .Sp چند مثال در اینجا آورده شده است: .Sp .Vb 11 \& Is the job sequence even or odd? \& \-\-rpl \*(Aq{odd} $_ = seq() % 2 ? "odd" : "even"\*(Aq \& Pad job sequence with leading zeros to get equal width \& \-\-rpl \*(Aq{0#} $f=1+int("".(log(total_jobs())/log(10))); \& $_=sprintf("%0${f}d",seq())\*(Aq \& Job sequence counting from 0 \& \-\-rpl \*(Aq{#0} $_ = seq() \- 1\*(Aq \& Job slot counting from 2 \& \-\-rpl \*(Aq{%1} $_ = slot() + 1\*(Aq \& Remove all extensions \& \-\-rpl \*(Aq{:} s:(\e.[^/]+)*$::\*(Aq .Ve .Sp می‌توانید با قرار دادن پرانتز در رشته جایگزین و افزودن یک عبارت منظم درون پرانتز، رشته‌های جایگزین پویا داشته باشید. رشته منطبق به صورت $$1 درج خواهد شد: .Sp .Vb 5 \& parallel \-\-rpl \*(Aq{%(.*?)} s/$$1//\*(Aq echo {%.tar.gz} ::: my.tar.gz \& parallel \-\-rpl \*(Aq{:+(.+?)} s:$$1(\e.[^/]+)*$::\*(Aq \e \& echo {:+_file} ::: my_file.tar.gz \& parallel \-n3 \-\-rpl \*(Aq{/:+(.*?)} s:.*/(.*)$$1(\e.[^/]+)*$:$1:\*(Aq \e \& echo job {#}: {2} {2.} {3/:+_1} ::: a/b.c c/d.e f/g_1.h.i .Ve .Sp حتی می‌توانید از چندین تطابق استفاده کنید: .Sp .Vb 2 \& parallel \-\-rpl \*(Aq{/(.+?)/(.*?)} s/$$1/$$2/;\*(Aq \& echo {/replacethis/withthis} {/b/C} ::: a_replacethis_b \& \& parallel \-\-rpl \*(Aq{(.*?)/(.*?)} $_="$$2$_$$1"\*(Aq \e \& echo {swap/these} ::: \-middle\- .Ve .Sp همچنین ببینید: \fB{=\fR\fIperl expression\fR\fB=}\fR \fB\-\-parens\fR .IP "\fB\-\-rsync\-opts\fR \fIoptions\fR" 4 .IX Item "--rsync-opts options" گزینه‌ها برای ارسال به \fBrsync\fR. .Sp تنظیم \fB\-\-rsync\-opts\fR بر مقدار متغیر محیطی \f(CW$PARALLEL_RSYNC_OPTS\fR اولویت دارد. .IP "\fB\-\-max\-chars\fR \fImax\-chars\fR" 4 .IX Item "--max-chars max-chars" .PD 0 .IP "\fB\-s\fR \fImax\-chars\fR" 4 .IX Item "-s max-chars" .PD محدود کردن طول دستور. .Sp حداکثر از \fImax\-chars\fR نویسه در هر خط دستور استفاده شود، شامل دستور و آرگومان‌های اولیه (initial\-arguments) و نویسه‌های null پایانی در انتهای رشته‌های آرگومان. بزرگ‌ترین مقدار مجاز وابسته به سیستم است و به صورت حد طول آرگومان برای exec منهای اندازه محیط شما محاسبه می‌شود. مقدار پیش‌فرض حداکثر ممکن است. .Sp می‌توان پسوندهای K، M، G، T، P، k، m، g، t یا p را به \fImax\-chars\fR اضافه کرد (بخش UNIT PREFIX را ببینید). .Sp مستلزم \fB\-X\fR است مگر اینکه \fB\-m\fR یا \fB\-\-xargs\fR تنظیم شده باشد. .Sp همچنین ببینید: \fB\-X\fR \fB\-m\fR \fB\-\-xargs\fR \fB\-\-max\-line\-length\-allowed\fR \&\fB\-\-show\-limits\fR .IP \fB\-\-show\-limits\fR 4 .IX Item "--show-limits" نمایش محدودیت‌های تعیین‌شده توسط سیستم‌عامل. .Sp نمایش محدودیت‌های طول خط فرمان که توسط سیستم‌عامل و گزینه \fB\-s\fR اعمال می‌شوند. اگر نمی‌خواهید GNU \fBparallel\fR کاری انجام دهد، ورودی را از dev/null/ پایپ کنید (و در صورت نیاز \-\-no\-run\-if\-empty را مشخص نمایید). .Sp همچنین ببینید: \fB\-\-max\-chars\fR \fB\-\-max\-line\-length\-allowed\fR \fB\-\-version\fR .IP \fB\-\-semaphore\fR 4 .IX Item "--semaphore" کارکرد به عنوان یک سمافور شمارشی (counting semaphore). .Sp گزینه \fB\-\-semaphore\fR باعث می‌شود GNU \fBparallel\fR دستور \fIcommand\fR را در پس‌زمینه اجرا کند. هنگامی که تعداد کارهای مشخص‌شده توسط \fB\-\-jobs\fR پر شد، GNU \fBparallel\fR پیش از شروع دستوری دیگر، منتظر اتمام یکی از این کارها می‌ماند. .Sp گزینه \fB\-\-semaphore\fR مستلزم \fB\-\-bg\fR است مگر اینکه \fB\-\-fg\fR مشخص شده باشد. .Sp دستور \fBsem\fR نام مستعاری (alias) برای \fBparallel \-\-semaphore\fR است. .Sp همچنین ببینید: \fBman sem\fR \fB\-\-bg\fR \fB\-\-fg\fR \fB\-\-semaphore\-name\fR \&\fB\-\-semaphore\-timeout\fR \fB\-\-wait\fR .IP "\fB\-\-semaphore\-name\fR \fIname\fR" 4 .IX Item "--semaphore-name name" .PD 0 .IP "\fB\-\-id\fR \fIname\fR" 4 .IX Item "--id name" .PD استفاده از \fBname\fR به عنوان نام سمافور. .Sp مقدار پیش‌فرض، نام tty کنترل‌کننده است (خروجی دستور \fBtty\fR). .Sp مقدار پیش‌فرض معمولاً در استفاده تعاملی طبق انتظار کار می‌کند، اما هنگام استفاده در یک اسکریپت باید \fIname\fR تنظیم شود. مقادیر \fI$$\fR یا \fImy_task_name\fR معمولاً گزینه‌های مناسبی هستند. .Sp سمافور در مسیر ‎~/.parallel/semaphores/‎ ذخیره می‌شود. .Sp مستلزم \fB\-\-semaphore\fR است. .Sp همچنین ببینید: \fBman sem\fR \fB\-\-semaphore\fR .IP "\fB\-\-semaphore\-timeout\fR \fIsecs\fR" 4 .IX Item "--semaphore-timeout secs" .PD 0 .IP "\fB\-\-st\fR \fIsecs\fR" 4 .IX Item "--st secs" .PD اگر 0 < \fIsecs\fR: چنانچه سمافور ظرف \fIsecs\fR ثانیه آزاد نشود، در هر صورت آن را در اختیار بگیر. .Sp اگر 0 > \fIsecs\fR: چنانچه سمافور ظرف \fIsecs\fR ثانیه آزاد نشود، خارج شو. .Sp مقدار \fIsecs\fR به ثانیه است، اما می‌تواند با پسوندهای s، m، h یا d همراه شود (بخش TIME POSTFIXES را ببینید). .Sp مستلزم \fB\-\-semaphore\fR است. .Sp همچنین ببینید: \fBman sem\fR .IP "\fB\-\-seqreplace\fR \fIreplace\-str\fR" 4 .IX Item "--seqreplace replace-str" استفاده از رشته جایگزین \fIreplace\-str\fR به جای \fB{#}\fR برای شماره توالی کار. .Sp همچنین ببینید: \fB{#}\fR .IP \fB\-\-session\fR 4 .IX Item "--session" ثبت نام‌های موجود در محیط فعلی در \fR\f(CB$PARALLEL_IGNORED_NAMES\fR\fB\fR و خروج. .Sp فقط همراه با \fBenv_parallel\fR استفاده می‌شود. نام مستعارها، توابع و متغیرهایی با نام‌های موجود در \fR\f(CB$PARALLEL_IGNORED_NAMES\fR\fB\fR کپی نخواهند شد. بنابراین باید متغیرها/توابعی را که می‌خواهید کپی شوند، \fIبعد از\fR اجرای \fB\-\-session\fR تنظیم کنید. .Sp این گزینه مشابه \fB\-\-record\-env\fR است، اما فقط برای این نشست اعمال می‌شود. .Sp فقط در \fBAsh, Bash, Dash, Ksh, Sh, and Zsh\fR پشتیبانی می‌شود. .Sp همچنین ببینید: \fB\-\-env\fR \fB\-\-record\-env\fR \fBenv_parallel\fR .IP "\fB\-\-shard\fR \fIshardexpr\fR" 4 .IX Item "--shard shardexpr" استفاده از \fIshardexpr\fR به عنوان کلید شارد و قطعه‌بندی (shard) ورودی برای کارها. .Sp عبارت \fIshardexpr\fR به صورت [column number|column name] [perlexpression] است، به عنوان مثال: .Sp .Vb 4 \& 3 \& Address \& 3 $_%=100 \& Address s/\ed//g .Ve .Sp هر خط ورودی با استفاده از \fB\-\-colsep\fR تفکیک می‌شود. رشته مربوط به ستون در \f(CW$_\fR قرار می‌گیرد، عبارت پرل اجرا می‌شود و رشته حاصل هش می‌گردد تا تمام خطوط با یک مقدار مشخص به همان اسلات کار اختصاص یابند. .Sp این عملکرد مشابه شاردینگ در پایگاه‌های داده است. .Sp کارایی در حدود ۱۰۰ هزار سطر در ثانیه است؛ اگر \fIshardcol\fR کوچک باشد (کمتر از 10) سریع‌تر و اگر بزرگ باشد (بیشتر از 100) کندتر خواهد بود. .Sp گزینه \fB\-\-shard\fR مستلزم \fB\-\-pipe\fR و یک مقدار عددی ثابت برای \fB\-\-jobs\fR است. .Sp بخش SPREADING BLOCKS OF DATA را ببینید. .Sp همچنین ببینید: \fB\-\-bin\fR \fB\-\-group\-by\fR \fB\-\-round\-robin\fR .IP \fB\-\-shebang\fR 4 .IX Item "--shebang" .PD 0 .IP \fB\-\-hashbang\fR 4 .IX Item "--hashbang" .PD ابزار GNU \fBparallel\fR می‌تواند به عنوان یک دستور شِبَنگ (#!) در خط اول یک اسکریپت فراخوانی شود. محتوای فایل به عنوان منبع ورودی (inputsource) در نظر گرفته خواهد شد. .Sp مانند این: .Sp .Vb 1 \& #!/usr/bin/parallel \-\-shebang \-r wget \& \& https://ftpmirror.gnu.org/parallel/parallel\-20120822.tar.bz2 \& https://ftpmirror.gnu.org/parallel/parallel\-20130822.tar.bz2 \& https://ftpmirror.gnu.org/parallel/parallel\-20140822.tar.bz2 .Ve .Sp گزینه \fB\-\-shebang\fR باید به عنوان اولین گزینه تنظیم شود. .Sp در FreeBSD دستور \fBenv\fR مورد نیاز است: .Sp .Vb 1 \& #!/usr/bin/env \-S parallel \-\-shebang \-r wget \& \& https://ftpmirror.gnu.org/parallel/parallel\-20120822.tar.bz2 \& https://ftpmirror.gnu.org/parallel/parallel\-20130822.tar.bz2 \& https://ftpmirror.gnu.org/parallel/parallel\-20140822.tar.bz2 .Ve .Sp محدودیت‌های زیادی برای شِبَنگ (#!) بسته به سیستم‌عامل شما وجود دارد. جزئیات را در https://www.in\-ulm.de/~mascheck/various/shebang ببینید. .Sp همچنین ببینید: \fB\-\-shebang\-wrap\fR .IP \fB\-\-shebang\-wrap\fR 4 .IX Item "--shebang-wrap" برنامه GNU \fBparallel\fR می‌تواند اسکریپت‌ها را با پوشش‌دادن خط shebang موازی‌سازی کند. اگر برنامه به این صورت قابل اجرا باشد: .Sp .Vb 1 \& cat arguments | parallel the_program .Ve .Sp آنگاه اسکریپت را می‌توان به این شکل تغییر داد: .Sp .Vb 1 \& #!/usr/bin/parallel \-\-shebang\-wrap /original/parser \-\-options .Ve .Sp برای مثال: .Sp .Vb 1 \& #!/usr/bin/parallel \-\-shebang\-wrap /usr/bin/python .Ve .Sp اگر برنامه به این صورت قابل اجرا باشد: .Sp .Vb 1 \& cat data | parallel \-\-pipe the_program .Ve .Sp آنگاه اسکریپت را می‌توان به این صورت تغییر داد: .Sp .Vb 1 \& #!/usr/bin/parallel \-\-shebang\-wrap \-\-pipe /orig/parser \-\-opts .Ve .Sp برای مثال: .Sp .Vb 1 \& #!/usr/bin/parallel \-\-shebang\-wrap \-\-pipe /usr/bin/perl \-w .Ve .Sp گزینه \fB\-\-shebang\-wrap\fR باید به عنوان اولین گزینه تنظیم شود. .Sp همچنین ببینید: \fB\-\-shebang\fR .IP "\fB\-\-shell\-completion\fR \fIshell\fR" 4 .IX Item "--shell-completion shell" تولید کد تکمیل شل (shell completion) برای شل‌های تعاملی. .Sp شل‌های پشتیبانی‌شده: bash zsh. .Sp از \fIauto\fR به عنوان \fIshell\fR برای تشخیص خودکار شل در حال اجرا استفاده کنید. .Sp فعال‌سازی کد تکمیل با: .Sp .Vb 2 \& zsh% eval "$(parallel \-\-shell\-completion auto)" \& bash$ eval "$(parallel \-\-shell\-completion auto)" .Ve .Sp یا این متن را در \`/usr/share/zsh/site\-functions/_parallel\` قرار داده، سپس \`compinit\` را برای تولید \`~/.zcompdump\` اجرا کنید: .Sp .Vb 1 \& #compdef parallel \& \& (( $+functions[_comp_parallel] )) || \& eval "$(parallel \-\-shell\-completion auto)" && \& _comp_parallel .Ve .IP \fB\-\-shell\-quote\fR 4 .IX Item "--shell-quote" دستور را اجرا نمی‌کند بلکه آن را کوت (نقل‌قول) می‌کند. برای ساخت دستورات ترکیبی کوت‌شده برای GNU \fBparallel\fR کاربرد دارد. .Sp استفاده چندباره از \fB\-\-shell\-quote\fR رشته را چندین بار کوت می‌کند، بنابراین \&\fBparallel \-\-shell\-quote | parallel \-\-shell\-quote\fR را می‌توان به صورت \&\fBparallel \-\-shell\-quote \-\-shell\-quote\fR نوشت. .Sp همچنین ببینید: \fB\-\-quote\fR .IP \fB\-\-shuf\fR 4 .IX Item "--shuf" برزدن (shuffle) کارها. .Sp هنگام استفاده از چندین منبع ورودی، تصادفی‌سازی کارها دشوار است. گزینه \fB\-\-shuf\fR تمام کارها را تولید کرده و پیش از اجرا آن‌ها را برمی‌زند. این ویژگی برای دریافت یک پیش‌نمایش سریع از نتایج پیش از اجرای کامل دسته کاربردی است. .Sp در ترکیب با \fB\-\-halt soon,done=1%\fR می‌توانید یک نمونه تصادفی ۱ درصدی از تمام کارها را اجرا کنید: .Sp .Vb 1 \& parallel \-\-shuf \-\-halt soon,done=1% echo ::: {1..100} ::: {1..100} .Ve .Sp همچنین ببینید: \fB\-\-halt\fR .IP \fB\-\-skip\-first\-line\fR 4 .IX Item "--skip-first-line" خط اول ورودی را نادیده می‌گیرد (توسط خود GNU \fBparallel\fR هنگام فراخوانی با \fB\-\-shebang\fR استفاده می‌شود). .IP "\fB\-\-sql\fR \fIDBURL\fR (منسوخ)" 4 .IX Item "--sql DBURL (obsolete)" به جای آن از \fB\-\-sql\-master\fR استفاده کنید. .IP "\fB\-\-sql\-master\fR \fIDBURL\fR" 4 .IX Item "--sql-master DBURL" ارسال کارها از طریق سرور SQL. مقدار \fIDBURL\fR باید به یک جدول اشاره کند که شامل همان اطلاعات \fB\-\-joblog\fR، مقادیر حاصل از منابع ورودی (ذخیره‌شده در ستون‌های V1 .. Vn)، و خروجی (ذخیره‌شده در ستون‌های Stdout و Stderr) خواهد بود. .Sp اگر \fIDBURL\fR با \*(Aq+\*(Aq شروع شود، GNU \fBparallel\fR فرض می‌کند جدول قبلاً با ستون‌های صحیح ایجاد شده است و کارها را به آن ضمیمه می‌کند. .Sp اگر \fIDBURL\fR با \*(Aq+\*(Aq شروع نشود، جدول حذف شده (drop) و با تعداد مناسب ستون‌های V ایجاد می‌شود مگر آنکه .Sp گزینه \fB\-\-sqlmaster\fR هیچ کاری را اجرا نمی‌کند، بلکه مقادیر مربوط به کارهایی که باید اجرا شوند را ایجاد می‌نماید. برای اجرای واقعی کارها باید یک یا چند \&\fB\-\-sqlworker\fR اجرا شوند. .Sp اگر \fB\-\-wait\fR تنظیم شده باشد، GNU \fBparallel\fR تا اتمام کارها منتظر خواهد ماند. .Sp قالب DBURL به این صورت است: .Sp .Vb 1 \& [sql:]vendor://[[user][:pwd]@][host][:port]/[db]/[table] .Ve .Sp برای مثال: .Sp .Vb 10 \& sql:mysql://hr:hr@localhost:3306/hrdb/jobs \& mysql://scott:tiger@my.example.com/pardb/paralleljobs \& sql:oracle://scott:tiger@ora.example.com/xe/parjob \& postgresql://scott:tiger@pg.example.com/pgdb/parjob \& pg:///parjob \& sqlite3:///%2Ftmp%2Fpardb.sqlite/parjob \& sqlite:///file_in_current_dir.sqlite/my_table \& csv:///%2Ftmp%2Fpardb/parjob \& csv:///./file_in_current_dir \& pg://// .Ve .Sp توجه کنید که چگونه / در مسیر sqlite و CSV باید به صورت \&\f(CW%2F\fR کدگذاری شود، به جز آخرین / در CSV که باید یک / باشد. .Sp مقادیر پیش‌فرض \fIdb\fR و \fItable\fR برابر با \f(CW$USER:\fR pg://// = pg:///$USER/$USER .Sp همچنین می‌تواند یک نام مستعار (alias) از ~/.sql/aliases باشد: .Sp .Vb 1 \& :myalias mysql:///mydb/paralleljobs .Ve .Sp همچنین ببینید: \fB\-\-sql\-and\-worker\fR \fB\-\-sql\-worker\fR \fB\-\-joblog\fR .IP "\fB\-\-sql\-and\-worker\fR \fIDBURL\fR" 4 .IX Item "--sql-and-worker DBURL" کوتاه‌نوشت برای: \fB\-\-sql\-master\fR \fIDBURL\fR \fB\-\-sql\-worker\fR \fIDBURL\fR. .Sp همچنین ببینید: \fB\-\-sql\-master\fR \fB\-\-sql\-worker\fR .IP "\fB\-\-sql\-worker\fR \fIDBURL\fR" 4 .IX Item "--sql-worker DBURL" اجرای کارها از طریق سرور SQL. متغیرهای منابع ورودی را از جدول مشخص‌شده توسط \&\fIDBURL\fR می‌خواند. دستور \fIcommand\fR در خط فرمان باید همان دستوری باشد که به \fB\-\-sqlmaster\fR داده شده است. .Sp اگر بیش از یک \fB\-\-sqlworker\fR داشته باشید، ممکن است کارها بیش از یک بار اجرا شوند. .Sp اگر \fB\-\-sqlworker\fR روی رایانه محلی اجرا شود، نام میزبان در جدول SQL به جای \*(Aq:\*(Aq نام میزبان همان رایانه خواهد بود. .Sp همچنین ببینید: \fB\-\-sql\-master\fR \fB\-\-sql\-and\-worker\fR .IP "\fB\-\-ssh\fR \fIsshcommand\fR (آزمایشی آلفا)" 4 .IX Item "--ssh sshcommand (alpha testing)" برنامه GNU \fBparallel\fR به طور پیش‌فرض از \fBssh\fR برای دسترسی از راه دور استفاده می‌کند. این مورد را می‌توان با \fB\-\-ssh\fR بازنویسی کرد. همچنین می‌توان آن را برای هر سرور به طور جداگانه با \fB\-\-sshlogin\fR تنظیم نمود. .Sp همچنین ببینید: \fB\-\-sshlogin\fR .IP "\fB\-\-ssh\-delay\fR \fIduration\fR" 4 .IX Item "--ssh-delay duration" تأخیر در شروع ssh بعدی به میزان \fIduration\fR. .Sp برنامه GNU \fBparallel\fR برای مدت زمان \fIduration\fR اتصال ssh دیگری را آغاز نخواهد کرد. .Sp مقدار \fIduration\fR به ثانیه است، اما می‌تواند پسوند s، m، h، یا d داشته باشد. .Sp همچنین ببینید: TIME POSTFIXES \fB\-\-sshlogin\fR \fB\-\-delay\fR .IP "\fB\-\-sshlogin\fR \fI[@hostgroups/][ncpus/][[user][:[password]]@]host[:port][,...]\fR (آزمایشی آلفا)" 4 .IX Item "--sshlogin [@hostgroups/][ncpus/][[user][:[password]]@]host[:port][,...] (alpha testing)" .PD 0 .ie n .IP "\fB\-\-sshlogin\fR \fR\fI@hostgroup\fR\fI\fR/" 4 .el .IP "\fB\-\-sshlogin\fR \fR\f(CI@hostgroup\fR\fI\fR/" 4 .IX Item "--sshlogin @hostgroup/" .IP "\fB\-S\fR \fI[@hostgroups/][ncpus/][ssh command][[user][:[password]]@]host[:port][,...]\fR (آزمایشی آلفا)" 4 .IX Item "-S [@hostgroups/][ncpus/][ssh command][[user][:[password]]@]host[:port][,...] (alpha testing)" .ie n .IP "\fB\-S\fR \fR\fI@hostgroup\fR\fI\fR/" 4 .el .IP "\fB\-S\fR \fR\f(CI@hostgroup\fR\fI\fR/" 4 .IX Item "-S @hostgroup/" .PD توزیع کارها روی رایانه‌های راه دور. .Sp کارها روی فهرستی از رایانه‌های راه دور اجرا خواهند شد. .RS 4 .IP " @\fIhostgroups\fR/" 15 .IX Item " @hostgroups/" یک یا چند گروه که این sshlogin به آن‌ها تعلق دارد. گروه‌های متعدد با \*(Aq+\*(Aq از هم جدا می‌شوند. گزینه \fIsshlogin\fR همیشه به یک گروه میزبان (hostgroup) هم‌نام با \fIsshlogin\fR افزوده خواهد شد. .Sp اگر تنها \fR\f(CI@hostgroup\fR\fI\fR مشخص شود، فقط sshloginهای موجود در آن گروه میزبان استفاده خواهند شد. می‌توان چندین \fI\fR\f(CI@hostgroup\fR\fI\fR مشخص کرد. .Sp ببینید: \fB\-\-hostgroup\fR. .Sp مثال‌ها: \fR\f(CB@prod\fR\fB/\fR، \fB\fR\f(CB@dev\fR\fB+remote/\fR .IP " \fIncpus\fR/" 15 .IX Item " ncpus/" اجبار تعداد رشته‌های (threads) پردازنده. .Sp برنامه GNU \fBparallel\fR تعداد پردازنده‌های رایانه‌های دوردست را تشخیص داده و تعداد کارها را بر اساس آنچه با \fB\-j\fR مشخص شده اجرا می‌کند. اگر عدد \&\fIncpus\fR داده شود، GNU \fBparallel\fR از این مقدار به عنوان تعداد رشته‌های پردازنده روی میزبان استفاده خواهد کرد. معمولاً به \fIncpus\fR نیازی نخواهد بود. .Sp مثال‌ها: \fB4/\fR، \fB12/\fR .IP " \fIssh command\fR" 15 .IX Item " ssh command" دستور \fIssh command\fR مورد استفاده. بعد از \fIssh command\fR باید یک فاصله قرار گیرد. .Sp مثال: \fB/usr/bin/lsh \-z\fR ، \fBautossh \-C\fR .IP " \fIuser\fR" 15 .IX Item " user" نام کاربری برای ورود. پیش‌فرض نام کاربری فعلی است. .Sp مثال‌ها: \fBalice\fR، \fBbob\fR .IP " :\fIpassword\fR" 15 .IX Item " :password" استفاده از \fIpassword\fR برای احراز هویت (با استفاده از \fBsshpass\fR). مقدار \&\fBpassword\fR نمی‌تواند شامل فاصله باشد. اگر \fIpassword\fR حذف شود، GNU \&\fBparallel\fR از \fR\f(CB$SSHPASS\fR\fB\fR استفاده می‌کند. اگر \fB:\fR حذف شود از احراز هویت پیش‌فرض \fBssh\fR استفاده می‌شود. در این حالت ورود نباید به گذرواژه نیاز داشته باشد (\fBssh\-agent\fR و \fBssh\-copy\-id\fR ممکن است در این زمینه کمک کنند). .Sp مثال‌ها: \fB:mypassword\fR، \fB:\fR .IP " \fIhost\fR" 15 .IX Item " host" نام میزبان یا نشانی IP سرور. (این موردی است که بیشترین استفاده را از آن خواهید داشت). .Sp مثال‌ها: \fBserver01\fR، \fB10.1.2.3\fR، \fB[2001:470:142:4::a]\fR، \&\fB2001:470:142:5::116\fR. .Sp محدوده‌ای از نام‌های میزبان را می‌توان در [] به این شکل مشخص کرد: \fBserver[1,3,8\-10]\fR (برای \fBserver1, server3, server8, server9, server10\fR) یا \&\fBserver[001,003,008\-010]\fR (برای \fBserver001, server003, server008, server009, server010\fR). با قابلیت بسط آکولاد در بش می‌توانید دستور \&\fB\-S{dev,prod}[001\-100]\fR را اجرا کنید تا \fB\-Sdev[001\-100] \-Sprod[001\-100]\fR حاصل شود. استفاده از چندین جفت [] نیز مجاز است: \&\fBserver[01\-10].cluster[1\-5].example.net\fR .IP " :\fIport\fR" 15 .IX Item " :port" شماره درگاه (پورت) برای اتصال. .Sp مثال‌ها: \fB:22\fR، \fB:2222\fR. .Sp برای IPv6 می‌توانید از \fBp\fR یا \fB#\fR به جای \fB:\fR استفاده کنید. .Sp مثال‌ها: \fB[2001:470:142:4::a]:2222\fR، \fB2001:470:142:5::116p2222\fR، \&\fB2001:470:142:5::116#22222\fR .RE .RS 4 .Sp ۳ نام با معنی خاص وجود دارد: .IP " \fI:\fR" 4 .IX Item " :" به معنی \*(Aqعدم استفاده از ssh\*(Aq است و بنابراین روی رایانه محلی اجرا خواهد شد. .IP " \fI..\fR" 4 .IX Item " .." خواندن sshloginها از \fB~/.parallel/sshloginfile\fR یا \&\fR\f(CB$XDG_CONFIG_HOME\fR\fB/parallel/sshloginfile\fR .IP " \fI\-\fR" 4 .IX Item " -" خواندن sshloginها از stdin (ورودی استاندارد). .RE .RS 4 .Sp برای مشخص کردن چندین sshlogin، آن‌ها را با کاما، خط جدید (در همان رشته) از هم جدا کنید، یا گزینه‌ها را چندین بار تکرار نمایید. .Sp برنامه GNU \fBparallel\fR رشته‌ها را بر اساس , (کاما) تفکیک می‌کند، بنابراین اگر sshlogin شما شامل , (کاما) است باید آن را با \e, یا ,, جایگزین کنید. .Sp برای مثال‌های کامل به \fB\-\-sshloginfile\fR مراجعه کنید. .Sp روی میزبان راه دور باید GNU \fBparallel\fR نصب شده باشد. .Sp مشخص شده است که \fB\-\-sshlogin\fR با گزینه‌های \fB\-m\fR و \fB\-X\fR دچار مشکل می‌شود. .Sp همچنین ببینید: \fB\-\-basefile\fR \fB\-\-transferfile\fR \fB\-\-return\fR \fB\-\-cleanup\fR \&\fB\-\-trc\fR \fB\-\-sshloginfile\fR \fB\-\-workdir\fR \fB\-\-filter\-hosts\fR \&\fB\-\-ssh\fR .RE .IP "\fB\-\-sshloginfile\fR \fIfilename\fR (آزمایشی بتا)" 4 .IX Item "--sshloginfile filename (beta testing)" .PD 0 .IP "\fB\-\-slf\fR \fIfilename\fR (آزمایشی بتا)" 4 .IX Item "--slf filename (beta testing)" .PD فایل حاوی sshloginها. این فایل شامل sshloginها در خطوط جداگانه است. خطوط خالی و خطوطی که با \*(Aq#\*(Aq شروع می‌شوند نادیده گرفته خواهند شد. مثال: .Sp .Vb 10 \& server.example.com \& username@server2.example.com \& 8/my\-8\-cpu\-server.example.com \& 2/my_other_username@my\-dualcore.example.net \& # These servers have SSH running on port 2222 \& ssh \-p 2222 server.example.net \& server01.example.net:2222 \& 4/ssh \-p 2222 quadserver.example.net \& # Use a different ssh program \& myssh \-p 2222 \-l myusername hexacpu.example.net \& # Use a different ssh program with default number of CPUs \& //usr/local/bin/myssh \-p 2222 \-l myusername hexacpu \& # Use a different ssh program with 6 CPUs \& 6//usr/local/bin/myssh \-p 2222 \-l myusername hexacpu \& # Assume 16 CPUs on the local computer \& 16/: \& # Use password for authentication \& user:password@host \& # Use $SSHPASS for authentication \& user:@host \& # Use $SSHPASS for authentication and current username \& :@host \& # Use password for authentication and current username \& :password@host \& # Login in as bob with :p@ss:w0rd@ as password \& bob::p@ss:w0rd@@host \& # Put server1 in hostgroup1 \& @hostgroup1/server1 \& # Put myusername@server2 in hostgroup1+hostgroup2 \& @hostgroup1+hostgroup2/myusername@server2 \& # Force 4 CPUs and put \*(Aqssh \-p 2222 server3\*(Aq in hostgroup1 \& @hostgroup1/4/ssh \-p 2222 server3 \& # TODO example with ,, .Ve .Sp هنگام استفاده از یک برنامه ssh متفاوت، آخرین آرگومان باید نام میزبان باشد. .Sp استفاده از چندین \fB\-\-sshloginfile\fR مجاز است. .Sp برنامه GNU \fBparallel\fR ابتدا به دنبال فایل در دایرکتوری فعلی می‌گردد؛ اگر یافت نشد در ~/.parallel جستجو می‌کند. .Sp ۳ نام با معنی خاص وجود دارد: .RS 4 .IP " \fI..\fR" 4 .IX Item " .." خواندن sshloginها از \fB~/.parallel/sshloginfile\fR .IP " \fI.\fR" 4 .IX Item " ." خواندن sshloginها از \fB/etc/parallel/sshloginfile\fR .IP " \fI\-\fR" 4 .IX Item " -" خواندن sshloginها از ورودی استاندارد (stdin). .RE .RS 4 .Sp اگر sshloginfile تغییر کند، پس از اتمام هر کار، مجدداً خوانده خواهد شد (حداکثر یک‌بار در ثانیه). این امکان را فراهم می‌سازد که هنگام اجرا، میزبان‌ها را اضافه یا حذف کنید. .Sp این ویژگی می‌تواند برای داشتن یک دیمن (daemon) استفاده شود که sshloginfile را به‌روزرسانی کند تا فقط شامل سرورهای فعال و در دسترس باشد: .Sp .Vb 10 \& cp original.slf tmp2.slf \& while [ 1 ] ; do \& nice parallel \-\-nonall \-j0 \-k \-\-slf original.slf \e \& \-\-tag echo | perl \*(Aqs/\et$//\*(Aq > tmp.slf \& if diff tmp.slf tmp2.slf; then \& mv tmp.slf tmp2.slf \& fi \& sleep 10 \& done & \& parallel \-\-slf tmp2.slf ... .Ve .Sp همچنین ببینید: \fB\-\-filter\-hosts\fR .RE .IP "\fB\-\-slotreplace\fR \fIreplace\-str\fR" 4 .IX Item "--slotreplace replace-str" استفاده از رشته جایگزین \fIreplace\-str\fR به جای \fB{%}\fR برای شماره اسلات کار. .Sp همچنین ببینید: \fB{%}\fR .IP \fB\-\-silent\fR 4 .IX Item "--silent" حالت بی‌صدا. .Sp کاری که باید اجرا شود در خروجی چاپ نخواهد شد. این حالت پیش‌فرض است. با \fB\-v\fR می‌توان آن را معکوس کرد. .Sp همچنین ببینید: \fB\-v\fR .IP "\fB\-\-template\fR \fIfile\fR=\fIrepl\fR" 4 .IX Item "--template file=repl" .PD 0 .IP "\fB\-\-tmpl\fR \fIfile\fR=\fIrepl\fR" 4 .IX Item "--tmpl file=repl" .PD جایگزینی رشته‌های جایگزین در \fIfile\fR و ذخیره آن در \fIrepl\fR. .Sp تمامی رشته‌های جایگزین در محتوای \fIfile\fR جایگزین خواهند شد. تمامی رشته‌های جایگزین در نام \fIrepl\fR نیز جایگزین خواهند شد. .Sp با استفاده از \fB\-\-cleanup\fR پس از پایان کار، فایل جدید حذف خواهد شد. .Sp اگر \fImy.tmpl\fR حاوی این متن باشد: .Sp .Vb 7 \& Xval: {x} \& Yval: {y} \& FixedValue: 9 \& # x with 2 decimals \& DecimalX: {=x $_=sprintf("%.2f",$_) =} \& TenX: {=x $_=$_*10 =} \& RandomVal: {=1 $_=rand() =} .Ve .Sp می‌توان از آن به این شکل استفاده کرد: .Sp .Vb 4 \& myprog() { echo Using "$@"; cat "$@"; } \& export \-f myprog \& parallel \-\-cleanup \-\-header : \-\-tmpl my.tmpl={#}.t myprog {#}.t \e \& ::: x 1.234 2.345 3.45678 ::: y 1 2 3 .Ve .Sp همچنین ببینید: \fB{}\fR \fB\-\-cleanup\fR .IP \fB\-\-tty\fR 4 .IX Item "--tty" باز کردن ترمینال tty. .Sp اگر از GNU \fBparallel\fR برای اجرای برنامه‌ای استفاده شود که به tty دسترسی دارد (مانند یک برنامه تعاملی)، ممکن است این گزینه مورد نیاز باشد. به طور پیش‌فرض فقط یک کار را در هر لحظه اجرا می‌کند (یعنی \fB\-j1\fR)، خروجی را بافر نمی‌کند (یعنی \fB\-u\fR)، و یک tty برای کار باز می‌کند. .Sp البته می‌توانید مقادیر \fB\-j1\fR و \fB\-u\fR را بازنویسی و لغو کنید. .Sp متأسفانه استفاده از \fB\-\-tty\fR به این معنی است که GNU \fBparallel\fR نمی‌تواند کارها را متوقف سازد (با \fB\-\-timeout\fR، \fB\-\-memfree\fR یا \fB\-\-halt\fR). این به این دلیل است که GNU \fBparallel\fR به هر پردازه فرزند یک گروه پردازه مجزا اختصاص می‌دهد که سپس متوقف می‌شوند. گروه‌های پردازه به tty وابسته هستند. .Sp همچنین ببینید: \fB\-\-ungroup\fR \fB\-\-open\-tty\fR .IP \fB\-\-tag\fR 4 .IX Item "--tag" برچسب‌گذاری خطوط با آرگومان‌ها. .Sp در ابتدای هر خط خروجی، آرگومان‌ها و یک تب (\et) درج خواهد شد. هنگام ترکیب با \fB\-\-onall\fR یا \fB\-\-nonall\fR، به جای آن، sshlogin در ابتدای خطوط قرار می‌گیرد. .Sp هنگام استفاده از \fB\-u\fR، گزینه \fB\-\-tag\fR نادیده گرفته می‌شود. .Sp همچنین ببینید: \fB\-\-tagstring\fR \fB\-\-ctag\fR .IP "\fB\-\-tagstring\fR \fIstr\fR" 4 .IX Item "--tagstring str" برچسب‌گذاری خطوط با یک رشته. .Sp در ابتدای هر خط خروجی، \fIstr\fR و یک تب (\et) درج خواهد شد. \fIstr\fR می‌تواند شامل رشته‌های جایگزین مانند \fB{}\fR باشد. .Sp هنگام استفاده از \fB\-u\fR، \fB\-\-onall\fR و \fB\-\-nonall\fR، گزینه \fB\-\-tagstring\fR نادیده گرفته می‌شود. .Sp همچنین ببینید: \fB\-\-tag\fR \fB\-\-ctagstring\fR .IP "\fB\-\-tee\fR (alpha testing)" 4 .IX Item "--tee (alpha testing)" هدایت (pipe) تمام داده‌ها به تمامی کارها. .Sp همراه با \fB\-\-pipe\fR/\fB\-\-pipe\-part\fR و \fB:::\fR استفاده می‌شود. .Sp .Vb 1 \& seq 1000 | parallel \-\-pipe \-\-tee \-v wc {} ::: \-w \-l \-c .Ve .Sp چه تعداد از اعداد ۱ تا ۱۰۰۰ شامل ارقام ۰ تا ۹ هستند، و چه مقدار بایت را اشغال می‌کنند: .Sp .Vb 2 \& seq 1000 | parallel \-\-pipe \-\-tee \-\-tag \e \& \*(Aqgrep {1} | wc {2}\*(Aq ::: {0..9} ::: \-l \-c .Ve .Sp چه تعداد از کلمات شامل حروف a تا z هستند و چند بایت را اشغال می‌کنند؟ .Sp .Vb 2 \& parallel \-a /usr/share/dict/words \-\-pipe\-part \-\-tee \-\-tag \e \& \*(Aqgrep {1} | wc {2}\*(Aq ::: {a..z} ::: \-l \-c .Ve .Sp همچنین ببینید: \fB:::\fR \fB\-\-pipe\fR \fB\-\-pipe\-part\fR .IP "\fB\-\-term\-seq\fR \fIsequence\fR" 4 .IX Item "--term-seq sequence" توالی خاتمه (termination sequence). .Sp هنگامی که یک کار به دلیل \fB\-\-timeout\fR، \fB\-\-memfree\fR، \fB\-\-halt\fR یا خاتمه غیرعادی GNU \fBparallel\fR متوقف می‌شود، \fIsequence\fR نحوه پایان دادن به کار را مشخص می‌کند. حالت پیش‌فرض عبارت است از: .Sp .Vb 1 \& TERM,200,TERM,100,TERM,50,KILL,25 .Ve .Sp که یک سیگنال TERM ارسال می‌کند، ۲۰۰ میلی‌ثانیه صبر می‌کند، یک سیگنال TERM دیگر می‌فرستد، ۱۰۰ میلی‌ثانیه صبر می‌کند، سیگنال TERM دیگری می‌فرستد، ۵۰ میلی‌ثانیه صبر می‌کند، یک سیگنال KILL ارسال می‌کند، ۲۵ میلی‌ثانیه صبر می‌کند و خارج می‌شود. GNU \fBparallel\fR تشخیص می‌دهد که آیا یک پردازه قبل از اتمام زمان انتظار پایان یافته است یا خیر. .Sp همچنین ببینید: \fB\-\-halt\fR \fB\-\-timeout\fR \fB\-\-memfree\fR .IP "\fB\-\-total\-jobs\fR \fIjobs\fR" 4 .IX Item "--total-jobs jobs" .PD 0 .IP "\fB\-\-total\fR \fIjobs\fR" 4 .IX Item "--total jobs" .PD ارائه تعداد کل کارها برای محاسبه زمان تقریبی اتمام (ETA) که برای \fB\-\-bar\fR نیز استفاده می‌شود. .Sp بدون \fB\-\-total\-jobs\fR، ابزار GNU Parallel قبل از شروع یک کار، تمامی کارها را خواهد خواند. در صورتی که ورودی به صورت آهسته تولید شود، \fB\-\-total\-jobs\fR مفید خواهد بود. .Sp همچنین ببینید: \fB\-\-bar\fR \fB\-\-eta\fR .IP "\fB\-\-tmpdir\fR \fIdirname\fR" 4 .IX Item "--tmpdir dirname" دایرکتوری برای فایل‌های موقت. .Sp به‌طور معمول GNU \fBparallel\fR خروجی را در فایل‌های موقت در /tmp بافر می‌کند. با تنظیم \fB\-\-tmpdir\fR می‌توانید از دایرکتوری دیگری برای فایل‌ها استفاده کنید. تنظیم \fB\-\-tmpdir\fR معادل مقداردهی \f(CW$TMPDIR\fR است. .Sp همچنین ببینید: \fB\-\-compress\fR \fR\f(CB$TMPDIR\fR\fB\fR \fB\fR\f(CB$PARALLEL_REMOTE_TMPDIR\fR\fB\fR .IP "\fB\-\-tmux\fR (alpha testing)" 4 .IX Item "--tmux (alpha testing)" استفاده از \fBtmux\fR برای خروجی. یک نشست (session) \fBtmux\fR را آغاز کرده و هر کار را در یک پنجره درون آن نشست اجرا می‌کند. هیچ خروجی دیگری تولید نخواهد شد. .Sp همچنین ببینید: \fB\-\-tmuxpane\fR .IP "\fB\-\-tmuxpane\fR (alpha testing)" 4 .IX Item "--tmuxpane (alpha testing)" استفاده از \fBtmux\fR برای خروجی اما قرار دادن خروجی درون قاب‌ها (panes) در پنجره اول. مناسب برای زمان‌هایی که می‌خواهید پیشرفت کمتر از ۱۰۰ کار همزمان را نظارت کنید. .Sp همچنین ببینید: \fB\-\-tmux\fR .IP "\fB\-\-timeout\fR \fIduration\fR" 4 .IX Item "--timeout duration" مهلت زمانی (timeout) برای دستور. اگر اجرای دستور بیش از \fIduration\fR ثانیه طول بکشد، طبق \fB\-\-term\-seq\fR متوقف خواهد شد. .Sp اگر بعد از \fIduration\fR علامت % بیاید، مهلت زمانی به صورت پویا به عنوان درصدی از میانه میانگین زمان اجرای کارهای موفق محاسبه می‌شود. تنها مقادیر > 100% منطقی خواهند بود. .Sp مقدار \fIduration\fR بر حسب ثانیه است، اما می‌تواند پسوندهای s، m، h یا d داشته باشد. .Sp همچنین ببینید: TIME POSTFIXES \fB\-\-term\-seq\fR \fB\-\-retries\fR .IP \fB\-\-verbose\fR 4 .IX Item "--verbose" .PD 0 .IP \fB\-t\fR 4 .IX Item "-t" .PD چاپ کاری که باید اجرا شود در خطای استاندارد (stderr). .Sp همچنین ببینید: \fB\-v\fR \fB\-\-interactive\fR .IP "\fB\-\-transfer\fR (beta testing)" 4 .IX Item "--transfer (beta testing)" انتقال فایل‌ها به رایانه‌های راه دور. .Sp مخفف برای: \fB\-\-transferfile {}\fR. .Sp همچنین ببینید: \fB\-\-transferfile\fR. .IP "\fB\-\-transferfile\fR \fIfilename\fR (beta testing)" 4 .IX Item "--transferfile filename (beta testing)" .PD 0 .IP "\fB\-\-tf\fR \fIfilename\fR" 4 .IX Item "--tf filename" .PD انتقال \fIfilename\fR به رایانه‌های راه دور. .Sp گزینه \fB\-\-transferfile\fR همراه با \fB\-\-sshlogin\fR برای انتقال فایل‌ها به رایانه‌های راه دور استفاده می‌شود. فایل‌ها با استفاده از \fBrsync\fR منتقل شده و به صورت نسبی نسبت به دایرکتوری کاری (work dir) قرار داده می‌شوند. .Sp به‌طور معمول \fIfilename\fR حاوی یک رشته جایگزین خواهد بود. .Sp اگر مسیر شامل /./ باشد، ادامه مسیر نسبت به دایرکتوری کاری نسبی خواهد بود (برای جزئیات: \fBrsync\fR را ببینید). اگر دایرکتوری کاری \fB/home/user\fR باشد، انتقال به صورت زیر خواهد بود: .Sp .Vb 4 \& /tmp/foo/bar => /tmp/foo/bar \& tmp/foo/bar => /home/user/tmp/foo/bar \& /tmp/./foo/bar => /home/user/foo/bar \& tmp/./foo/bar => /home/user/foo/bar .Ve .Sp \&\fIمثال‌ها\fR .Sp این دستور فایل \fIfoo/bar.txt\fR را قبل از اجرای \fBwc foo/bar.txt\fR در \fIserver.example.com\fR، به رایانه \fIserver.example.com\fR در فایل \fR\f(CI$HOME\fR\fI/foo/bar.txt\fR منتقل می‌کند: .Sp .Vb 2 \& echo foo/bar.txt | parallel \-\-transferfile {} \e \& \-\-sshlogin server.example.com wc .Ve .Sp این دستور فایل \fI/tmp/foo/bar.txt\fR را قبل از اجرای \fBwc /tmp/foo/bar.txt\fR در \fIserver.example.com\fR، به رایانه \fIserver.example.com\fR در فایل \fI/tmp/foo/bar.txt\fR منتقل می‌کند: .Sp .Vb 2 \& echo /tmp/foo/bar.txt | parallel \-\-transferfile {} \e \& \-\-sshlogin server.example.com wc .Ve .Sp این دستور فایل \fI/tmp/foo/bar.txt\fR را قبل از اجرای \fBwc ./foo/bar.txt\fR در \fIserver.example.com\fR، به رایانه \fIserver.example.com\fR در فایل \fIfoo/bar.txt\fR منتقل می‌کند: .Sp .Vb 2 \& echo /tmp/./foo/bar.txt | parallel \-\-transferfile {} \e \& \-\-sshlogin server.example.com wc {= s:.*/\e./:./: =} .Ve .Sp گزینه \fB\-\-transferfile\fR اغلب همراه با \fB\-\-return\fR و \fB\-\-cleanup\fR استفاده می‌شود. معادل کوتاه‌تر برای \fB\-\-transferfile {}\fR گزینه \fB\-\-transfer\fR است. .Sp گزینه \fB\-\-transferfile\fR هنگام استفاده با \fB\-\-sshlogin :\fR یا زمانی که بدون \fB\-\-sshlogin\fR استفاده شود نادیده گرفته می‌شود. .Sp همچنین ببینید: \fB\-\-workdir\fR \fB\-\-sshlogin\fR \fB\-\-basefile\fR \fB\-\-return\fR \&\fB\-\-cleanup\fR .IP "\fB\-\-trc\fR \fIfilename\fR" 4 .IX Item "--trc filename" انتقال، بازگرداندن، پاکسازی (Transfer, Return, Cleanup). مخفف برای: \fB\-\-transfer\fR \fB\-\-return\fR \&\fIfilename\fR \fB\-\-cleanup\fR .Sp همچنین ببینید: \fB\-\-transfer\fR \fB\-\-return\fR \fB\-\-cleanup\fR .IP "\fB\-\-trim\fR " 4 .IX Item "--trim " حذف فاصله‌های خالی (white space) در ورودی. .RS 4 .IP n 4 .IX Item "n" بدون حذف فاصله. ورودی تغییری نمی‌کند. این حالت پیش‌فرض است. .IP l 4 .IX Item "l" حذف فاصله از چپ. حذف فاصله‌های خالی از ابتدای ورودی. برای مثال: " a bc " \-> "a bc ". .IP r 4 .IX Item "r" حذف فاصله از راست. حذف فاصله‌های خالی از انتهای ورودی. برای مثال: " a bc " \-> " a bc". .IP lr 4 .IX Item "lr" .PD 0 .IP rl 4 .IX Item "rl" .PD حذف فاصله از هر دو طرف. حذف فاصله‌های خالی از ابتدا و انتهای ورودی. برای مثال: " a bc " \-> "a bc". در صورت استفاده از \fB\-\-colsep\fR این حالت پیش‌فرض خواهد بود. .RE .RS 4 .Sp همچنین ببینید: \fB\-\-no\-run\-if\-empty\fR \fB{}\fR \fB\-\-colsep\fR .RE .IP \fB\-\-ungroup\fR 4 .IX Item "--ungroup" .PD 0 .IP \fB\-u\fR 4 .IX Item "-u" .PD تفکیک نکردن (گروه‌بندی نکردن) خروجی. .Sp خروجی در سریع‌ترین زمان ممکن چاپ شده و پردازش داخلی GNU \fBparallel\fR را دور می‌زند. این امر ممکن است باعث درهم‌آمیختن خروجی دستورات مختلف شود، بنابراین فقط در صورتی باید استفاده شود که به تفکیک خروجی نیازی ندارید. این موارد را مقایسه کنید: .Sp .Vb 4 \& seq 4 | parallel \-j0 \e \& \*(Aqsleep {};echo \-n start{};sleep {};echo {}end\*(Aq \& seq 4 | parallel \-u \-j0 \e \& \*(Aqsleep {};echo \-n start{};sleep {};echo {}end\*(Aq .Ve .Sp همچنین \fB\-\-tag\fR را غیرفعال می‌کند. خروجی GNU \fBparallel\fR با \&\fB\-u\fR سریع‌تر است. سرعت این موارد را مقایسه کنید: .Sp .Vb 3 \& parallel seq ::: 300000000 >/dev/null \& parallel \-u seq ::: 300000000 >/dev/null \& parallel \-\-line\-buffer seq ::: 300000000 >/dev/null .Ve .Sp با \fB\-\-group\fR می‌توان آن را معکوس کرد. .Sp همچنین ببینید: \fB\-\-line\-buffer\fR \fB\-\-group\fR .IP \fB\-\-unsafe\fR 4 .IX Item "--unsafe" ابزار GNU \fBparallel\fR تلاش می‌کند محتاطانه عمل کند تا از نتایج غیرمنتظره جلوگیری شود. گزینه \fB\-\-unsafe\fR به GNU \fBparallel\fR اجازه می‌دهد در محیط‌ها و روی ورودی‌هایی اجرا شود که آزمایش نشده‌اند و ممکن است منجر به نتایج غیرمنتظره و حتی مشکلات امنیتی شوند، به‌طوری که یک مهاجم بتواند بر نتایج تأثیر بگذارد. حملاتی مشابه Shellshock را در نظر بگیرید: https://en.wikipedia.org/wiki/Shellshock_(software_bug) .Sp اگر برای کاری که ایمن است همیشه مجبور به استفاده از \fB\-\-unsafe\fR هستید، زمان آن رسیده که یک گزارش باگ ثبت کنید و درباره نحوه پوشش وضعیت خود در آزمون‌ها گفتگو کنید. .IP \fB\-\-use\-sockets\-instead\-of\-threads\fR 4 .IX Item "--use-sockets-instead-of-threads" همچنین ببینید: \fB\-\-use\-cores\-instead\-of\-threads\fR .IP \fB\-\-use\-cores\-instead\-of\-threads\fR 4 .IX Item "--use-cores-instead-of-threads" .PD 0 .IP "\fB\-\-use\-cpus\-instead\-of\-cores\fR (obsolete)" 4 .IX Item "--use-cpus-instead-of-cores (obsolete)" .PD تعیین می‌کند که GNU \fBparallel\fR چگونه تعداد CPUها را شمارش کند. .Sp ابزار GNU \fBparallel\fR از این تعداد زمانی استفاده می‌کند که تعداد اسلات‌های کار (\fB\-\-jobs\fR) به‌صورت نسبتی از تعداد CPUها محاسبه می‌شود (مثلاً %100 یا +1). .Sp پردازنده‌ها (CPUها) را می‌توان به سه روش مختلف شمارش کرد: .RS 4 .IP sockets 8 .IX Item "sockets" تعداد سوکت‌های پرشده CPU (یعنی تعداد چیپ‌های فیزیکی). .IP cores 8 .IX Item "cores" تعداد هسته‌های فیزیکی (یعنی تعداد هسته‌های پردازشی فیزیکی). .IP threads 8 .IX Item "threads" تعداد هسته‌های دارای Hyper-Threading (یعنی تعداد هسته‌های مجازی \- که برخی از آن‌ها ممکن است hyperthreaded باشند). .RE .RS 4 .Sp به‌طور معمول تعداد CPUها به‌عنوان تعداد رشته‌های (threads) پردازنده محاسبه می‌شود. با \fB\-\-use\-sockets\-instead\-of\-threads\fR یا \&\fB\-\-use\-cores\-instead\-of\-threads\fR می‌توانید برنامه را مجبور کنید که در عوض تعداد سوکت‌های پرشده یا تعداد هسته‌ها را محاسبه کند. .Sp بیشتر کاربران به این گزینه‌ها نیازی نخواهند داشت. .Sp گزینه \&\fB\-\-use\-cpus\-instead\-of\-cores\fR یک نام مستعار (گمراه‌کننده) برای \&\fB\-\-use\-sockets\-instead\-of\-threads\fR است و برای سازگاری با نسخه‌های پیشین حفظ شده است. .Sp همچنین ببینید: \fB\-\-number\-of\-threads\fR \fB\-\-number\-of\-cores\fR \&\fB\-\-number\-of\-sockets\fR .RE .IP \fB\-v\fR 4 .IX Item "-v" نمایش با جزئیات (Verbose). .Sp کاری را که قرار است اجرا شود در stdout (خروجی استاندارد) چاپ می‌کند. با \fB\-\-silent\fR می‌توان آن را لغو کرد. .Sp از \fB\-v\fR \fB\-v\fR برای چاپ دستور دربرگیرنده ssh هنگام اجرای راه دور استفاده کنید. .Sp همچنین ببینید: \fB\-t\fR .IP \fB\-\-version\fR 4 .IX Item "--version" .PD 0 .IP \fB\-V\fR 4 .IX Item "-V" .PD نسخه GNU \fBparallel\fR را چاپ کرده و خارج می‌شود. .IP "\fB\-\-workdir\fR \fImydir\fR" 4 .IX Item "--workdir mydir" .PD 0 .IP "\fB\-\-wd\fR \fImydir\fR" 4 .IX Item "--wd mydir" .PD کارها در دایرکتوری \fImydir\fR اجرا خواهند شد. مقدار پیش‌فرض برای دستگاه محلی، دایرکتوری جاری و برای رایانه‌های راه دور، دایرکتوری ورود (login dir) است. .Sp فایل‌های منتقل‌شده با استفاده از \fB\-\-transferfile\fR و \fB\-\-return\fR نسبت به \fImydir\fR در رایانه‌های راه دور سنجیده خواهند شد. .Sp مقدار ویژه \fB...\fR برای \fImydir\fR، دایرکتوری‌های کاری را زیر \&\fB~/.parallel/tmp/\fR ایجاد می‌کند. در صورت مشخص شدن \fB\-\-cleanup\fR این دایرکتوری‌ها حذف خواهند شد. .Sp مقدار ویژه \fB.\fR برای \fImydir\fR از دایرکتوری کاری جاری استفاده می‌کند. اگر دایرکتوری کاری جاری زیر دایرکتوری خانگی (home dir) شما باشد، مقدار \fB.\fR به‌عنوان مسیر نسبی به دایرکتوری خانگی در نظر گرفته می‌شود. این بدان معناست که اگر دایرکتوری خانگی شما در رایانه‌های راه دور متفاوت باشد (مثلاً نام کاربری شما متفاوت باشد)، مسیر نسبی همچنان نسبت به دایرکتوری خانگی شما خواهد بود. .Sp برای دیدن تفاوت، این دستورها را امتحان کنید: .Sp .Vb 3 \& parallel \-S server pwd ::: "" \& parallel \-\-wd . \-S server pwd ::: "" \& parallel \-\-wd ... \-S server pwd ::: "" .Ve .Sp مقدار \&\fImydir\fR می‌تواند شامل رشته‌های جایگزینی GNU \fBparallel\fR باشد. .IP \fB\-\-wait\fR 4 .IX Item "--wait" منتظر ماندن برای اتمام تمامی دستورات. .Sp همراه با \fB\-\-semaphore\fR یا \fB\-\-sqlmaster\fR استفاده می‌شود. .Sp همچنین ببینید: \fBman sem\fR .IP \fB\-X\fR 4 .IX Item "-X" چندین آرگومان با جایگزینی متنی (context replace). تا جایی که طول خط فرمان اجازه می‌دهد آرگومان درج می‌کند. اگر چندین کار به‌صورت موازی در حال اجرا باشند: آرگومان‌ها را به‌طور یکنواخت بین کارها توزیع می‌کند. برای جلوگیری از این رفتار از \fB\-j1\fR استفاده کنید. .Sp اگر از \fB{}\fR استفاده نشود، آرگومان‌ها به انتهای خط اضافه می‌شوند. اگر \&\fB{}\fR به‌عنوان بخشی از یک کلمه استفاده شود (مانند \fIpic{}.jpg\fR)، کل کلمه تکرار خواهد شد. اگر \fB{}\fR چندین بار استفاده شود، هر \fB{}\fR با آرگومان‌ها جایگزین می‌شود. .Sp به‌طور معمول \fB\-X\fR عملکرد درستی دارد، در حالی که اگر \fB{}\fR به‌عنوان بخشی از یک کلمه استفاده شود، \fB\-m\fR ممکن است نتایج غیرمنتظره‌ای بدهد. .Sp پشتیبانی از \fB\-X\fR همراه با \fB\-\-sshlogin\fR محدود است و ممکن است ناموفق باشد. .Sp همچنین ببینید: \fB\-m\fR .IP \fB\-\-exit\fR 4 .IX Item "--exit" .PD 0 .IP \fB\-x\fR 4 .IX Item "-x" .PD خروج در صورت فراتر رفتن از اندازه (گزینه \fB\-s\fR را ببینید). .IP \fB\-\-xargs\fR 4 .IX Item "--xargs" چندین آرگومان. تا جایی که طول خط فرمان اجازه می‌دهد آرگومان درج می‌کند. .Sp اگر از \fB{}\fR استفاده نشود، آرگومان‌ها به انتهای خط اضافه می‌شوند. اگر \fB{}\fR چندین بار استفاده شود، هر \fB{}\fR با تمامی آرگومان‌ها جایگزین خواهد شد. .Sp پشتیبانی از \fB\-\-xargs\fR همراه با \fB\-\-sshlogin\fR محدود است و ممکن است ناموفق باشد. .Sp همچنین ببینید: \fB\-X\fR .SH "مثال‌ها (EXAMPLES)" .IX Header "EXAMPLES" ببینید: \fBman parallel_examples\fR .SH "توزیع بلوک‌های داده (SPREADING BLOCKS OF DATA)" .IX Header "SPREADING BLOCKS OF DATA" گزینه‌های \&\fB\-\-round\-robin\fR، \fB\-\-pipe\-part\fR، \fB\-\-shard\fR، \fB\-\-bin\fR و \&\fB\-\-group\-by\fR همگی نسخه‌های تخصصی‌یافته \fB\-\-pipe\fR هستند. .PP در ادامه \fIn\fR تعداد اسلات‌های کار است که توسط \fB\-\-jobs\fR مشخص می‌شود. یک رکورد با \fB\-\-recstart\fR شروع و با \fB\-\-recend\fR پایان می‌یابد. معمولاً یک خط کامل است. یک تکه (chunk) تعدادی رکورد کامل است که اندازه آن تقریباً برابر با یک بلوک است. یک بلوک می‌تواند شامل نیمه‌رکورد باشد، اما یک تکه (chunk) نمی‌تواند. .PP گزینه \&\fB\-\-pipe\fR به ازای هر تکه (chunk) یک کار را آغاز می‌کند. بلوک‌ها را از stdin (ورودی استاندارد) می‌خواند. پایان رکورد را در نزدیکی مرز بلوک پیدا می‌کند و تکه را به برنامه تحویل می‌دهد. .PP گزینه \&\fB\-\-pipe\-part\fR درست مانند \fB\-\-pipe\fR معمولی، به ازای هر تکه یک کار را آغاز می‌کند. ابتدا پایان رکوردها را در نزدیکی تمام مرزهای بلوک در فایل پیدا کرده و سپس کارها را شروع می‌کند. با استفاده از \fB\-\-block \-1\fR، اندازه بلوک را روی size\-of\-file/\fIn\fR تنظیم می‌کند. در این حالت در مجموع \fIn\fR کار آغاز خواهد شد. .PP گزینه \&\fB\-\-round\-robin\fR در مجموع \fIn\fR کار را آغاز می‌کند. یک بلوک را خوانده و تکه را به هر کاری که آماده خواندن باشد تحویل می‌دهد. محتوا را تجزیه (parse) نمی‌کند، مگر برای شناسایی محل پایان رکورد تا اطمینان یابد که فقط رکوردهای کامل را منتقل می‌کند. .PP گزینه \&\fB\-\-shard\fR در مجموع \fIn\fR کار را آغاز می‌کند. هر خط را برای خواندن رشته موجود در ستون مشخص‌شده تجزیه می‌کند. بر اساس این رشته، خط به یکی از \fIn\fR کار تحویل داده می‌شود. تمام خطوط دارای این رشته به همان اسلات کار داده خواهند شد. .PP گزینه \&\fB\-\-bin\fR مانند \fB\-\-shard\fR عمل می‌کند اما مقدار ستون باید عددی باشد و نشان‌دهنده شماره اسلات کاری است که خط به آن تحویل داده می‌شود. اگر مقدار بزرگتر از \fIn\fR باشد، مقدار \fIn\fR از آن کسر می‌شود تا زمانی که مقدار کوچکتر یا مساوی \fIn\fR شود. .PP گزینه \&\fB\-\-group\-by\fR به ازای هر تکه یک کار را آغاز می‌کند. مرزهای رکورد توسط \fB\-\-recend\fR/\fB\-\-recstart\fR تعیین نمی‌شوند. در عوض، رکورد توسط گروهی از خطوط که رشته یکسانی در یک ستون مشخص دارند تعریف می‌شود. بنابراین رشته ستون مشخص در مرز تکه تغییر می‌کند. با \fB\-\-pipe\fR هر خط تجزیه می‌شود، با \fB\-\-pipe\-part\fR تنها چند خط برای یافتن مرز تکه بررسی می‌شوند. .PP گزینه \&\fB\-\-group\-by\fR می‌تواند با \fB\-\-round\-robin\fR یا \fB\-\-pipe\-part\fR ترکیب شود. .SH "پسوندهای زمان (TIME POSTFIXES)" .IX Header "TIME POSTFIXES" آرگومان‌هایی که مدت‌زمان را مشخص می‌کنند بر حسب ثانیه داده می‌شوند، اما می‌توان آن‌ها را به‌صورت اعداد اعشاری همراه با پسوندهای \fBs\fR، \fBm\fR، \fBh\fR یا \fBd\fR بیان کرد که عدد اعشاری را به ترتیب در 1، 60، 60*60 یا 60*60*24 ضرب می‌کنند. بنابراین این دو معادل یکدیگرند: 100000 و 1d3.5h16.6m4s. .SH "پیشوندهای واحد (UNIT PREFIX)" .IX Header "UNIT PREFIX" بسیاری از آرگومان‌های عددی در GNU \fBparallel\fR می‌توانند دارای پسوند K، M، G، T، P، k، m، g، t یا p باشند که عدد را به ترتیب در 1024، 1048576، 1073741824، 1099511627776، 1125899906842624، 1000، 1000000، 1000000000، 1000000000000 یا 1000000000000000 ضرب می‌کنند. .PP حتی می‌توانید آن را به‌صورت یک عبارت ریاضی بنویسید. برای مثال 1000000 را می‌توان به‌صورت 1M\-12*2.024*2k نوشت. .SH "نقل‌قول و کوتیشن (QUOTING)" .IX Header "QUOTING" ابزار GNU \fBparallel\fR در برخورد با نقل‌قول‌ها بسیار منعطف و آسان‌گیر است. تنها کافی است کاراکترهایی را که معنای ویژه‌ای در شل دارند داخل نقل‌قول (کوتیشن) قرار دهید یا اسکیپ کنید: .PP .Vb 1 \& ( ) $ \` \*(Aq " < > ; | \e .Ve .PP و بسته به زمینه (context)، این کاراکترها نیز باید کوت شوند: .PP .Vb 1 \& ~ & ! ? space * { # .Ve .PP بنابراین بیشتر افراد هرگز به چیزی بیشتر از قرار دادن \*(Aq\e\*(Aq در جلوی کاراکترهای خاص نیاز نخواهند داشت. .PP اغلب می‌توانید به سادگی \e\*(Aq را در دو طرف هر \*(Aq قرار دهید: .PP .Vb 1 \& perl \-ne \*(Aq/^\eS+\es+\eS+$/ and print $ARGV,"\en"\*(Aq file .Ve .PP می‌تواند به این صورت کوت شود: .PP .Vb 1 \& parallel perl \-ne \e\*(Aq\*(Aq/^\eS+\es+\eS+$/ and print $ARGV,"\en"\*(Aq\e\*(Aq ::: file .Ve .PP با این حال، زمانی که می‌خواهید از متغیر شل استفاده کنید، باید علامت $ را کوت/اسکیپ کنید. در اینجا مثالی با استفاده از \f(CW$PARALLEL_SEQ\fR آورده شده است. این متغیر توسط خود GNU \fBparallel\fR مقداردهی می‌شود، بنابراین ارزیابی $ باید توسط زیرشل (sub shell) آغازشده توسط GNU \fBparallel\fR انجام شود: .PP .Vb 1 \& seq 10 | parallel \-N2 echo seq:\e$PARALLEL_SEQ arg1:{1} arg2:{2} .Ve .PP اگر متغیر پیش از شروع GNU \fBparallel\fR مقداردهی شده باشد، می‌توانید به این صورت عمل کنید: .PP .Vb 2 \& VAR=this_is_set_before_starting \& echo test | parallel echo {} $VAR .Ve .PP چاپ می‌کند: \fBtest this_is_set_before_starting\fR .PP اگر متغیر شامل بیش از یک فاصله پشت سر هم باشد کمی پیچیده‌تر می‌شود: .PP .Vb 2 \& VAR="two spaces between each word" \& echo test | parallel echo {} \e\*(Aq"$VAR"\e\*(Aq .Ve .PP چاپ می‌کند: \fBtest two spaces between each word\fR .PP اگر قرار نیست متغیر توسط شلی که GNU \fBparallel\fR را اجرا می‌کند ارزیابی شود بلکه باید توسط زیرشلی که توسط GNU \fBparallel\fR آغاز می‌شود ارزیابی گردد، در این صورت باید آن را کوت کنید: .PP .Vb 1 \& echo test | parallel VAR=this_is_set_after_starting \e; echo {} \e$VAR .Ve .PP چاپ می‌کند: \fBtest this_is_set_after_starting\fR .PP اگر متغیر شامل فاصله باشد کمی پیچیده‌تر است: .PP .Vb 2 \& echo test |\e \& parallel VAR=\*(Aq"two spaces between each word"\*(Aq echo {} \e\*(Aq"$VAR"\e\*(Aq .Ve .PP چاپ می‌کند: \fBtest two spaces between each word\fR .PP متغیر $$ یک متغیر شل حاوی شناسه فرآیند (process id) شل است. این دستور شناسه فرآیند شلی را که GNU \fBparallel\fR را اجرا می‌کند چاپ خواهد کرد: .PP .Vb 1 \& seq 10 | parallel echo $$ .Ve .PP و این دستور شناسه‌های فرآیند زیرشل‌های راه‌اندازی‌شده توسط GNU \fBparallel\fR را چاپ می‌کند: .PP .Vb 1 \& seq 10 | parallel echo \e$\e$ .Ve .PP اگر کاراکترهای خاص نباید توسط زیرشل ارزیابی شوند، باید از آن‌ها در برابر ارزیابی هم توسط شل آغازکننده GNU \fBparallel\fR و هم زیرشل محافظت کنید: .PP .Vb 1 \& echo test | parallel echo {} \e\e\e$VAR .Ve .PP چاپ می‌کند: \fBtest \fR\f(CB$VAR\fR .PP ابزار GNU \fBparallel\fR می‌تواند با استفاده از \-q از ارزیابی توسط زیرشل محافظت کند: .PP .Vb 1 \& echo test | parallel \-q echo {} \e$VAR .Ve .PP چاپ می‌کند: \fBtest \fR\f(CB$VAR\fR .PP این ویژگی به‌ویژه زمانی که نقل‌قول‌ها و کوتیشن‌های زیادی دارید بسیار کاربردی است. اگر می‌خواهید یک اسکریپت perl مانند زیر را اجرا کنید: .PP .Vb 1 \& perl \-ne \*(Aq/^\eS+\es+\eS+$/ and print $ARGV,"\en"\*(Aq file .Ve .PP باید به یکی از این شکل‌ها کوت شود: .PP .Vb 2 \& ls | parallel perl \-ne \*(Aq/^\e\eS+\e\es+\e\eS+\e$/\e and\e print\e \e$ARGV,\e"\e\en\e"\*(Aq \& ls | parallel perl \-ne \e\*(Aq\*(Aq/^\eS+\es+\eS+$/ and print $ARGV,"\en"\*(Aq\e\*(Aq .Ve .PP توجه کنید که چگونه فاصله‌ها، کاراکترهای \e\*(Aq، "\*(Aq و $\*(Aq باید کوت شوند. ابزار GNU \fBparallel\fR می‌تواند با استفاده از گزینه \-q کوتینگ را انجام دهد: .PP .Vb 1 \& ls | parallel \-q perl \-ne \*(Aq/^\eS+\es+\eS+$/ and print $ARGV,"\en"\*(Aq .Ve .PP با این حال، این بدان معناست که نمی‌توانید زیرشل را مجبور به تفسیر کاراکترهای خاص کنید. برای مثال به دلیل \fB\-q\fR موارد زیر کار نخواهند کرد: .PP .Vb 2 \& ls *.gz | parallel \-q "zcat {} >{.}" \& ls *.gz | parallel \-q "zcat {} | bzip2 >{.}.bz2" .Ve .PP زیرا > و | باید توسط زیرشل تفسیر شوند. .PP اگر با خطاهایی مانند زیر مواجه شدید: .PP .Vb 5 \& sh: \-c: line 0: syntax error near unexpected token \& sh: Syntax error: Unterminated quoted string \& sh: \-c: line 0: unexpected EOF while looking for matching \`\*(Aq\*(Aq \& sh: \-c: line 1: syntax error: unexpected end of file \& zsh:1: no matches found: .Ve .PP می‌توانید استفاده از \fB\-q\fR را امتحان کنید. .PP اگر از جایگزینی فرایند \fBbash\fR مانند \fB<(cat foo)\fR استفاده می‌کنید، می‌توانید \fB\-q\fR و قرار دادن \fBbash \-c\fR پیش از \fIcommand\fR را امتحان کنید: .PP .Vb 1 \& ls | parallel \-q bash \-c \*(Aqwc \-c <(echo {})\*(Aq .Ve .PP یا برای جایگزینی خروجی: .PP .Vb 2 \& ls | parallel \-q bash \-c \e \& \*(Aqtar c {} | tee >(gzip >{}.tar.gz) | bzip2 >{}.tar.bz2\*(Aq .Ve .PP \&\fBنتیجه‌گیری\fR: اگر این موضوع گیج‌کننده است، می‌توانید با نوشتن یک اسکریپت کوچک یا یک تابع (به یاد داشته باشید که تابع را با \fBexport \-f\fR صادر کنید) و فراخوانی آن توسط GNU \fBparallel\fR، از درگیر شدن با نقل‌قول‌ها (کوتیشن) اجتناب کنید. .SH "فهرست کردن کارهای در حال اجرا (LIST RUNNING JOBS)" .IX Header "LIST RUNNING JOBS" اگر فهرستی از کارهای در حال اجرا می‌خواهید، می‌توانید دستور زیر را اجرا کنید: .PP .Vb 1 \& killall \-USR1 parallel .Ve .PP سپس GNU \fBparallel\fR کارهای در حال اجرا را در خروجی خطای استاندارد (stderr) چاپ خواهد کرد. .SH "تکمیل کارهای در حال اجرا بدون شروع کارهای جدید (COMPLETE RUNNING JOBS BUT DO NOT START NEW JOBS)" .IX Header "COMPLETE RUNNING JOBS BUT DO NOT START NEW JOBS" اگر از شروع کارهای زیاد پشیمان شدید می‌توانید به سادگی اجرای GNU \fBparallel\fR را قطع کنید، اما اگر می‌خواهید مطمئن شوید که کارهای نیمه‌کاره باقی نمی‌مانند، باید سیگنال \fBSIGHUP\fR را به GNU \fBparallel\fR ارسال کنید: .PP .Vb 1 \& killall \-HUP parallel .Ve .PP این دستور به GNU \fBparallel\fR اطلاع می‌دهد که هیچ کار جدیدی را شروع نکند، اما قبل از خروج منتظر بماند تا کارهای در حال اجرا به پایان برسند. .SH "متغیرهای محیطی (ENVIRONMENT VARIABLES)" .IX Header "ENVIRONMENT VARIABLES" .ie n .IP $PARALLEL_HOME 9 .el .IP \f(CW$PARALLEL_HOME\fR 9 .IX Item "$PARALLEL_HOME" دایرکتوری‌ای که در آن GNU \fBparallel\fR فایل‌های پیکربندی، سمافورها و اطلاعات کش بین فراخوانی‌ها را ذخیره می‌کند. اگر روی یک دایرکتوری ناموجود تنظیم شود، آن دایرکتوری ایجاد خواهد شد. .Sp پیش‌فرض: \f(CW$HOME\fR/.parallel. .ie n .IP $PARALLEL_ARGHOSTGROUPS 9 .el .IP \f(CW$PARALLEL_ARGHOSTGROUPS\fR 9 .IX Item "$PARALLEL_ARGHOSTGROUPS" هنگام استفاده از \fB\-\-hostgroups\fR، ابزار GNU \fBparallel\fR این متغیر را روی گروه‌های میزبان (hostgroups) کار تنظیم می‌کند. .Sp به یاد داشته باشید که علامت $ را کوت کنید تا توسط شل درست ارزیابی شود. یا از \fB\-\-plus\fR و {agrp} استفاده کنید. .ie n .IP $PARALLEL_HOSTGROUPS 9 .el .IP \f(CW$PARALLEL_HOSTGROUPS\fR 9 .IX Item "$PARALLEL_HOSTGROUPS" هنگام استفاده از \fB\-\-hostgroups\fR، ابزار GNU \fBparallel\fR این متغیر را روی گروه‌های میزبانِ لاگین ssh که کار روی آن اجرا می‌شود تنظیم می‌کند. .Sp به یاد داشته باشید که علامت $ را کوت کنید تا توسط شل درست ارزیابی شود. یا از \fB\-\-plus\fR و {hgrp} استفاده کنید. .ie n .IP $PARALLEL_JOBSLOT 9 .el .IP \f(CW$PARALLEL_JOBSLOT\fR 9 .IX Item "$PARALLEL_JOBSLOT" توسط GNU \fBparallel\fR مقداردهی می‌شود و می‌تواند در کارهای اجرا شده توسط GNU \fBparallel\fR استفاده شود. به یاد داشته باشید که علامت $ را کوت کنید تا توسط شل درست ارزیابی شود. یا از \fB\-\-plus\fR و {slot} استفاده کنید. .Sp متغیر \f(CW$PARALLEL_JOBSLOT\fR اسلات کار (jobslot) است. این مقدار برابر با {%} است مگر اینکه کار در حال تلاش مجدد باشد. برای جزئیات به {%} مراجعه کنید. .ie n .IP $PARALLEL_PID 9 .el .IP \f(CW$PARALLEL_PID\fR 9 .IX Item "$PARALLEL_PID" توسط GNU \fBparallel\fR مقداردهی می‌شود و می‌تواند در کارهای اجرا شده توسط GNU \fBparallel\fR استفاده شود. به یاد داشته باشید که علامت $ را کوت کنید تا توسط شل درست ارزیابی شود. .Sp این متغیر ارتباط مستقیم کارها با GNU \fBparallel\fR را ممکن می‌سازد. .Sp \&\fBمثال:\fR اگر هر یک از کارها راه‌حلی را آزمایش کند و یکی از کارها راه‌حل را پیدا کند، آن کار می‌تواند با دستور \fBkill \-HUP \fR\f(CB$PARALLEL_PID\fR به GNU \fBparallel\fR اعلام کند که کار دیگری را شروع نکند. این ویژگی فقط روی رایانه محلی کار می‌کند. .ie n .IP $PARALLEL_RSYNC_OPTS 9 .el .IP \f(CW$PARALLEL_RSYNC_OPTS\fR 9 .IX Item "$PARALLEL_RSYNC_OPTS" گزینه‌هایی که به \fBrsync\fR ارسال می‌شوند. مقدار پیش‌فرض: \-rlDzR. .ie n .IP $PARALLEL_SHELL 9 .el .IP \f(CW$PARALLEL_SHELL\fR 9 .IX Item "$PARALLEL_SHELL" استفاده از این شل برای دستورات اجرا شده توسط GNU \fBparallel\fR: .RS 9 .IP \(bu 2 \&\f(CW$PARALLEL_SHELL\fR؛ اگر تعریف نشده باشد، از موارد زیر استفاده می‌شود: .IP \(bu 2 شلی که GNU \fBparallel\fR را راه‌اندازی کرده است؛ اگر قابل تشخیص نباشد: .IP \(bu 2 \&\f(CW$SHELL\fR؛ اگر تعریف نشده باشد، از: .IP \(bu 2 /bin/sh .RE .RS 9 .RE .ie n .IP $PARALLEL_SSH 9 .el .IP \f(CW$PARALLEL_SSH\fR 9 .IX Item "$PARALLEL_SSH" ابزار GNU \fBparallel\fR به طور پیش‌فرض از دستور \fBssh\fR برای دسترسی از راه دور استفاده می‌کند. این مقدار را می‌توان با \f(CW$PARALLEL_SSH\fR بازنویسی کرد، که مجدداً با \fB\-\-ssh\fR قابل لغو است. همچنین می‌توان آن را به ازای هر سرور تنظیم کرد (ببینید: \fB\-\-sshlogin\fR). .ie n .IP $PARALLEL_SSHHOST 9 .el .IP \f(CW$PARALLEL_SSHHOST\fR 9 .IX Item "$PARALLEL_SSHHOST" توسط GNU \fBparallel\fR مقداردهی می‌شود و می‌تواند در کارهای اجرا شده توسط GNU \fBparallel\fR استفاده شود. به یاد داشته باشید که علامت $ را کوت کنید تا توسط شل درست ارزیابی شود. یا از \fB\-\-plus\fR و {host} استفاده کنید. .Sp متغیر \f(CW$PARALLEL_SSHHOST\fR بخش مربوط به میزبان (host) در یک خط sshlogin است. برای مثال: .Sp .Vb 1 \& 4//usr/bin/specialssh user@host .Ve .Sp تبدیل می‌شود به: .Sp .Vb 1 \& host .Ve .ie n .IP $PARALLEL_SSHLOGIN 9 .el .IP \f(CW$PARALLEL_SSHLOGIN\fR 9 .IX Item "$PARALLEL_SSHLOGIN" توسط GNU \fBparallel\fR مقداردهی می‌شود و می‌تواند در کارهای اجرا شده توسط GNU \fBparallel\fR استفاده شود. به یاد داشته باشید که علامت $ را کوت کنید تا توسط شل درست ارزیابی شود. یا از \fB\-\-plus\fR و {sshlogin} استفاده کنید. .Sp این مقدار همان خط sshlogin است که تعداد ریسه‌ها (threads) از آن حذف شده است. برای مثال: .Sp .Vb 1 \& 4//usr/bin/specialssh user@host .Ve .Sp تبدیل می‌شود به: .Sp .Vb 1 \& /usr/bin/specialssh user@host .Ve .ie n .IP $PARALLEL_SEQ 9 .el .IP \f(CW$PARALLEL_SEQ\fR 9 .IX Item "$PARALLEL_SEQ" توسط GNU \fBparallel\fR مقداردهی می‌شود و می‌تواند در کارهای اجرا شده توسط GNU \fBparallel\fR استفاده شود. به یاد داشته باشید که علامت $ را کوت کنید تا توسط شل درست ارزیابی شود. .Sp متغیر \f(CW$PARALLEL_SEQ\fR شماره ترتیبی (توالی) کار در حال اجرا است. .Sp \&\fBمثال:\fR .Sp .Vb 2 \& seq 10 | parallel \-N2 \e \& echo seq:\*(Aq$\*(AqPARALLEL_SEQ arg1:{1} arg2:{2} .Ve .Sp نماد {#} کوته‌نوشتی برای \f(CW$PARALLEL_SEQ\fR است. .ie n .IP $PARALLEL_TMUX 9 .el .IP \f(CW$PARALLEL_TMUX\fR 9 .IX Item "$PARALLEL_TMUX" مسیر اجرایی \fBtmux\fR. در صورت عدم تنظیم، از \fBtmux\fR موجود در \f(CW$PATH\fR استفاده می‌شود. .ie n .IP $TMPDIR 9 .el .IP \f(CW$TMPDIR\fR 9 .IX Item "$TMPDIR" دایرکتوری فایل‌های موقت. .Sp همچنین ببینید: \fB\-\-tmpdir\fR .ie n .IP $PARALLEL_REMOTE_TMPDIR 9 .el .IP \f(CW$PARALLEL_REMOTE_TMPDIR\fR 9 .IX Item "$PARALLEL_REMOTE_TMPDIR" دایرکتوری فایل‌های موقت روی سرورهای راه دور. .Sp همچنین ببینید: \fB\-\-tmpdir\fR .ie n .IP $PARALLEL 9 .el .IP \f(CW$PARALLEL\fR 9 .IX Item "$PARALLEL" متغیر محیطی \f(CW$PARALLEL\fR به عنوان گزینه‌های پیش‌فرض برای GNU \fBparallel\fR استفاده خواهد شد. اگر متغیر شامل نویسه‌های خاص شل باشد (مانند $، *، یا فاصله)، این نویسه‌ها باید با \e اسکیپ شوند. .Sp \&\fBمثال:\fR .Sp .Vb 2 \& cat list | parallel \-j1 \-k \-v ls \& cat list | parallel \-j1 \-k \-v \-S"myssh user@server" ls .Ve .Sp می‌تواند به صورت زیر نوشته شود: .Sp .Vb 3 \& cat list | PARALLEL="\-kvj1" parallel ls \& cat list | PARALLEL=\*(Aq\-kvj1 \-S myssh\e user@server\*(Aq \e \& parallel echo .Ve .Sp توجه داشته باشید که \e پس از \*(Aqmyssh\*(Aq لازم است زیرا \*(Aqmyssh\*(Aq و \*(Aquser@server\*(Aq باید یک آرگومان باشند. .Sp همچنین ببینید: \fB\-\-profile\fR .SH "پروفایل پیش‌فرض (فایل پیکربندی) (DEFAULT PROFILE (CONFIG FILE))" .IX Header "DEFAULT PROFILE (CONFIG FILE)" فایل پیکربندی سراسری /etc/parallel/config و پس از آن فایل پیکربندی کاربر ~/.parallel/config (که قبلاً با نام .parallelrc شناخته می‌شد) در صورت وجود به نوبت خوانده خواهند شد. خطوطی که با \*(Aq#\*(Aq شروع شوند نادیده گرفته می‌شوند. قالب فایل می‌تواند شبیه متغیر محیطی \f(CW$PARALLEL\fR باشد، اما اغلب ساده‌تر است که هر گزینه را در یک خط جداگانه قرار دهید. .PP گزینه‌های مشخص‌شده در خط فرمان بالاترین اولویت را دارند، پس از آن متغیر محیطی \f(CW$PARALLEL\fR، سپس فایل پیکربندی کاربر ~/.parallel/config و در نهایت فایل پیکربندی سراسری /etc/parallel/config اولویت دارند. .PP توجه داشته باشید که هیچ فایلی که برای خواندن گزینه‌ها بررسی می‌شود، و همچنین متغیر محیطی \f(CW$PARALLEL\fR، نباید شامل گزینه‌های منسوخ‌شده مانند \fB\-\-tollef\fR باشند. .SH "فایل‌های پروفایل (PROFILE FILES)" .IX Header "PROFILE FILES" اگر \fB\-\-profile\fR تنظیم شده باشد، GNU \fBparallel\fR پروفایل را از آن فایل به جای فایل‌های پیکربندی سراسری یا کاربر خواهد خواند. می‌توانید چندین \fB\-\-profiles\fR داشته باشید. .PP پروفایل‌ها در \fB~/.parallel\fR جستجو می‌شوند. اگر نام با \fB/\fR شروع شود به عنوان مسیر مطلق در نظر گرفته می‌شود. اگر نام با \fB./\fR شروع شود به عنوان مسیر نسبی از دایرکتوری جاری در نظر گرفته می‌شود. .PP مثال: پروفایل برای اجرای یک دستور روی هر sshlogin در ~/.ssh/sshlogins و اضافه کردن پیشوند sshlogin به ابتدای خروجی: .PP .Vb 2 \& echo \-\-tag \-S .. \-\-nonall > ~/.parallel/nonall_profile \& parallel \-J nonall_profile uptime .Ve .PP مثال: پروفایل برای اجرای هر دستور با \fB\-j\-1\fR و \fBnice\fR: .PP .Vb 2 \& echo \-j\-1 nice > ~/.parallel/nice_profile \& parallel \-J nice_profile bzip2 \-9 ::: * .Ve .PP مثال: پروفایل برای اجرای یک اسکریپت perl پیش از هر دستور: .PP .Vb 3 \& echo "perl \-e \*(Aq\e$a=\e$\e$; print \e$a,\e" \e",\*(Aq\e$PARALLEL_SEQ\*(Aq,\e" \e";\*(Aq;" \e \& > ~/.parallel/pre_perl \& parallel \-J pre_perl echo ::: * .Ve .PP توجه داشته باشید که چگونه $ و " باید با استفاده از \e کوت (اسکیپ) شوند. .PP مثال: پروفایل برای اجرای کارهای توزیع‌شده با \fBnice\fR روی رایانه‌های راه دور: .PP .Vb 2 \& echo \-S .. nice > ~/.parallel/dist \& parallel \-J dist \-\-trc {.}.bz2 bzip2 \-9 ::: * .Ve .SH "وضعیت خروج (EXIT STATUS)" .IX Header "EXIT STATUS" اگر یکی از مقادیر success=X،‏ success=Y% یا fail=Y% استفاده شده باشد، وضعیت خروج به \fB\-\-halt\-on\-error\fR بستگی دارد. .IP 0 6 تمام کارها بدون خطا اجرا شدند. اگر success=X استفاده شده باشد: X کار بدون خطا اجرا شدند. اگر success=Y% استفاده شده باشد: Y% کارها بدون خطا اجرا شدند. .IP 1\-100 6 .IX Item "1-100" برخی از کارها ناموفق بودند. وضعیت خروج تعداد کارهای ناموفق را نشان می‌دهد. اگر Y% استفاده شده باشد، وضعیت خروج درصد کارهای ناموفق است. .IP 101 6 .IX Item "101" بیش از ۱۰۰ کار ناموفق بودند. .IP 255 6 .IX Item "255" سایر خطاها. .IP "\-1 (در joblog و جدول SQL)" 6 .IX Item "-1 (In joblog and SQL table)" متوقف‌شده توسط Ctrl\-C، پایان مهلت زمانی (timeout)، کمبود حافظه یا موارد مشابه. .IP "\-2 (در joblog و جدول SQL)" 6 .IX Item "-2 (In joblog and SQL table)" تابع \fBskip()\fR در \fB{= =}\fR فراخوانی شده است. .IP "\-1000 (در جدول SQL)" 6 .IX Item "-1000 (In SQL table)" کار آماده اجرا است (تنظیم‌شده توسط \-\-sqlmaster). .IP "\-1220 (در جدول SQL)" 6 .IX Item "-1220 (In SQL table)" کار توسط ورکر برداشته شده است (تنظیم‌شده توسط \-\-sqlworker). .PP اگر fail=1 استفاده شود، وضعیت خروج برابر با وضعیت خروج کارِ ناموفق خواهد بود. .SH "تفاوت‌های بین GNU Parallel و جایگزین‌ها (DIFFERENCES BETWEEN GNU Parallel AND ALTERNATIVES)" .IX Header "DIFFERENCES BETWEEN GNU Parallel AND ALTERNATIVES" ببینید: \fBman parallel_alternatives\fR .SH "ایرادات (BUGS)" .IX Header "BUGS" .SS "نقل‌قول خط جدید (Quoting of newline)" .IX Subsection "Quoting of newline" به دلیل نحوه کوت شدن خط جدید (newline)، دستور زیر کار نخواهد کرد: .PP .Vb 1 \& echo 1,2,3 | parallel \-vkd, "echo \*(Aqa{}b\*(Aq" .Ve .PP با این حال، موارد زیر همگی کار خواهند کرد: .PP .Vb 3 \& echo 1,2,3 | parallel \-vkd, echo a{}b \& echo 1,2,3 | parallel \-vkd, "echo \*(Aqa\*(Aq{}\*(Aqb\*(Aq" \& echo 1,2,3 | parallel \-vkd, "echo \*(Aqa\*(Aq"{}"\*(Aqb\*(Aq" .Ve .SS "سرعت (Speed)" .IX Subsection "Speed" \fIراه‌اندازی\fR .IX Subsection "Startup" .PP ابزار GNU \fBparallel\fR در راه‌اندازی اولیه کند است \- حدود ۲۵۰ میلی‌ثانیه برای بار اول و ۱۵۰ میلی‌ثانیه پس از آن. .PP \fIراه‌اندازی کار\fR .IX Subsection "Job startup" .PP شروع یک کار روی ماشین محلی حدود ۳ تا ۱۰ میلی‌ثانیه طول می‌کشد. اگر اجرای کار تنها چند میلی‌ثانیه طول بکشد، این زمان می‌تواند سربار بزرگی باشد. اغلب می‌توانید با استفاده از \fB\-X\fR کارهای کوچک را با یکدیگر گروه‌بندی کنید تا این سربار کمتر احساس شود. یا می‌توانید چندین GNU \fBparallel\fR را مطابق آنچه در \fBEXAMPLE: Speeding up fast jobs\fR شرح داده شده اجرا کنید. .PP \fISSH\fR .IX Subsection "SSH" .PP هنگام استفاده از چندین رایانه، ابزار GNU \fBparallel\fR اتصال‌های \fBssh\fR را به آن‌ها باز می‌کند تا مشخص کند چه تعداد اتصال را می‌توان به‌طور قابل‌اطمینان و هم‌زمان استفاده کرد (به‌ویژه MaxStartups در SSHD). این آزمایش برای هر میزبان به صورت سریالی انجام می‌شود؛ بنابراین اگر \fB\-\-sshloginfile\fR شما شامل میزبان‌های زیادی باشد، ممکن است کند باشد. .PP اگر کارهای شما کوتاه باشند، ممکن است مشاهده کنید که تعداد کارهای در حال اجرا روی سیستم‌های راه دور کمتر از حد انتظار است. این به دلیل زمانی است که صرف ورود و خروج به سیستم می‌شود. گزینه \fB\-M\fR ممکن است در اینجا کمک کند. .PP \fIدسترسی به دیسک (Disk access)\fR .IX Subsection "Disk access" .PP یک دیسک منفرد معمولاً می‌تواند داده‌ها را سریع‌تر بخواند اگر در هر زمان یک فایل را بخواند به جای خواندن تعداد زیادی فایل به‌صورت موازی، چرا که این کار از جستجوهای مکرر هد دیسک (seek) جلوگیری می‌کند. با این حال، سیستم‌های دیسک جدیدتر با چندین درایو در صورت خواندن هم‌زمان از چندین فایل به‌صورت موازی می‌توانند سریع‌تر عمل کنند. .PP اگر کارها به صورت خواندن\-همه\-محاسبه\-همه\-نوشتن\-همه (read\-all\-compute\-all\-write\-all) باشند، به طوری که قبل از نوشتن هر چیزی همه داده‌ها خوانده شوند، ممکن است سریع‌تر باشد که در هر زمان تنها یک دسترسی به دیسک را اجبار کنید: .PP .Vb 1 \& sem \-\-id diskio cat file | compute | sem \-\-id diskio cat > file .Ve .PP اگر کارها به صورت خواندن\-محاسبه\-نوشتن (read\-compute\-write) باشند، به طوری که نوشتن قبل از پایان کامل خواندن آغاز شود، ممکن است سریع‌تر باشد که در هر زمان فقط یک خواننده و یک نویسنده را اجبار کنید: .PP .Vb 1 \& sem \-\-id read cat file | compute | sem \-\-id write cat > file .Ve .PP اگر کارها به صورت خواندن\-محاسبه\-خواندن\-محاسبه (read\-compute\-read\-compute) باشند، ممکن است اجرای کارهای موازی بیشتر از تعداد CPUهای سیستم سریع‌تر باشد، زیرا برخی از کارها در انتظار دسترسی به دیسک متوقف خواهند شد. .SS "محدود شدن طول دستور توسط \-\-nice" .IX Subsection "--nice limits command length" پیاده‌سازی فعلی \fB\-\-nice\fR در برآورد حداکثر طول مجاز دستور بیش از حد بدبینانه است. این گزینه فقط کمی بیشتر از نیمی از مقداری را که می‌توانست استفاده کند به کار می‌گیرد. این امر بر \fB\-X\fR و \fB\-m\fR تأثیر می‌گذارد. اگر این موضوع برای شما به یک مشکل واقعی تبدیل شد، یک گزارش باگ ارسال کنید. .SS "نام‌های مستعار (Aliases) و توابع کار نمی‌کنند" .IX Subsection "Aliases and functions do not work" اگر با خطای زیر مواجه شدید: .PP .Vb 1 \& Can\*(Aqt exec "command": No such file or directory .Ve .PP یا: .PP .Vb 1 \& open3: exec of by command failed .Ve .PP یا: .PP .Vb 1 \& /bin/bash: command: command not found .Ve .PP ممکن است به این دلیل باشد که \fIcommand\fR ناشناخته است، اما می‌تواند به این دلیل نیز باشد که \fIcommand\fR یک نام مستعار (alias) یا یک تابع است. اگر تابع است، ابتدا باید تابع را با \fBexport \-f\fR صادر (export) کنید یا از \fBenv_parallel\fR استفاده نمایید. یک نام مستعار تنها در صورتی کار خواهد کرد که از \fBenv_parallel\fR استفاده کنید. .SS "پایگاه‌داده با MySQL به‌طور تصادفی با شکست مواجه می‌شود" .IX Subsection "Database with MySQL fails randomly" گزینه‌های \fB\-\-sql*\fR ممکن است در تعامل با MySQL به‌صورت تصادفی دچار خطا شوند. این مشکل در PostgreSQL وجود ندارد. .SH "گزارش باگ‌ها (REPORTING BUGS)" .IX Header "REPORTING BUGS" گزارش باگ‌ها را به یا https://savannah.gnu.org/bugs/?func=additem&group=parallel ارسال کنید. .PP هنگام نوشتن گزارش، لطفاً توجه داشته باشید که باید اطلاعات کافی به خواننده بدهید تا بتواند دقیقاً همان کاری را که شما اجرا کرده‌اید اجرا کند. بنابراین باید تمام داده‌ها و برنامه‌هایی را که برای نشان دادن مشکل استفاده می‌کنید، بگنجانید. .PP یک نمونه کامل و بی‌نقص از گزارش باگ را در این آدرس ببینید: https://lists.gnu.org/archive/html/bug\-parallel/2015\-01/msg00000.html .PP گزارش باگ شما باید همیشه شامل موارد زیر باشد: .IP \(bu 2 پیام خطایی که دریافت می‌کنید (در صورت وجود). اگر پیام خطا از طرف GNU \fBparallel\fR نیست، باید نشان دهید چرا فکر می‌کنید GNU \fBparallel\fR باعث آن شده است. .IP \(bu 2 خروجی کامل \fBparallel \-\-version\fR. اگر از آخرین نسخه منتشرشده استفاده نمی‌کنید (ببینید https://ftp.gnu.org/gnu/parallel)، باید مشخص کنید چرا معتقدید مشکل در آن نسخه برطرف نشده است. .IP \(bu 2 یک مثال کمینه، کامل و قابل بازتولید (توضیحات را در https://stackoverflow.com/help/mcve ببینید). .Sp این باید یک مثال کامل باشد که دیگران بتوانند آن را اجرا کنند و مشکل را نشان دهد، شامل تمامی فایل‌های لازم برای اجرای مثال. این مثال ترجیحاً باید کوچک و ساده باشد، بنابراین سعی کنید تا حد امکان گزینه‌های اضافی را حذف کنید. .Sp ترکیبی از \fByes\fR، \fBseq\fR، \fBcat\fR، \fBecho\fR، \fBwc\fR و \fBsleep\fR می‌تواند اکثر خطاها را بازتولید کند. .Sp اگر مثال شما به فایل‌های حجیم نیاز دارد، بررسی کنید آیا می‌توانید آن‌ها را با دستوراتی مانند \fBseq 100000000\fR > \fBbigfile\fR یا \fByes | head \-n 1000000000\fR > \fBfile\fR ایجاد کنید. اگر به چندین ستون نیاز دارید: \fBpaste <(seq 1000) <(seq 1000 1999)\fR .Sp اگر مثال شما نیازمند اجرای راه دور است، بررسی کنید آیا می‌توانید از \&\fBlocalhost\fR استفاده کنید \- شاید با استفاده از یک نام کاربری دیگر. .Sp اگر به سیستم دیگری دسترسی دارید (شاید یک VirtualBox روی رایانه خودتان)، آزمایش کنید که آیا MCVE شما مشکل را روی آن سیستم نیز نشان می‌دهد یا خیر. اگر نشان نداد، بخش زیر را بخوانید. .IP \(bu 2 خروجی مثال شما و آنچه در مقابل انتظار داشتید. اگر مشکل شما به راحتی توسط دیگران قابل بازتولید نیست، خروجی ممکن است به آن‌ها در تشخیص مشکل کمک کند. .IP \(bu 2 اینکه آیا ویدیوهای مقدماتی (https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1) را تماشا کرده‌اید، آموزش (man parallel_tutorial) را مرور کرده‌اید و مثال‌ها (man parallel_examples) را خوانده‌اید یا خیر. .SS "باگ وابسته به محیط" .IX Subsection "Bug dependent on environment" اگر گمان می‌کنید خطا به محیط یا توزیع شما وابسته است، لطفاً بررسی کنید آیا می‌توانید خطا را روی یکی از این ایمیج‌های VirtualBox بازتولید کنید: https://sourceforge.net/projects/virtualboximage/files https://www.osboxes.org/virtualbox\-images .PP تنها مشخص کردن نام توزیع کافی نیست زیرا ممکن است نرم‌افزاری را نصب کرده باشید که در ایمیج‌های VirtualBox وجود ندارد. .PP اگر نمی‌توانید خطا را روی هیچ‌یک از ایمیج‌های VirtualBox بالا بازتولید کنید، بررسی کنید آیا می‌توانید ایمیج VirtualBox بسازید که خطا روی آن بازتولید شود. در غیر این صورت باید فرض کنید که رفع اشکال از طریق شما انجام خواهد شد. این کار بار بسیار بیشتری بر دوش شما خواهد گذاشت و بسیار مهم است که هر اطلاعاتی که به حل مشکل کمک می‌کند ارائه دهید. به طور کلی اگر بتوانید خطا را در یک VirtualBox بازتولید کنید \- حتی اگر مجبور به ساخت یک ایمیج VirtualBox باشید \- مشکل بسیار سریع‌تر و با زحمت بسیار کمتری برای شما رفع خواهد شد. .SS "به طور خلاصه" .IX Subsection "In summary" گزارش شما باید شامل موارد زیر باشد: .IP \(bu 2 \&\fBparallel \-\-version\fR .IP \(bu 2 خروجی + پیام خطا .IP \(bu 2 مثال کامل شامل تمامی فایل‌ها .IP \(bu 2 ایمیج VirtualBox، اگر نمی‌توانید آن را روی سیستم‌های دیگر بازتولید کنید .SH "نویسنده (AUTHOR)" .IX Header "AUTHOR" هنگام استفاده از GNU \fBparallel\fR در یک مقاله یا انتشار علمی، لطفاً ارجاع دهید: .PP O. Tange (2011): GNU Parallel \- The Command\-Line Power Tool, ;login: The USENIX Magazine, February 2011:42\-47. .PP این کار به تأمین مالی توسعه بیشتر کمک می‌کند؛ و هیچ هزینه‌ای برای شما نخواهد داشت. اگر مبلغ ۱۰۰۰۰ یورو بپردازید، می‌توانید بدون ارجاع دادن از GNU Parallel استفاده کنید. .PP حق نشر (C) 2007\-10\-18 اوله تانگه (Ole Tange)، http://ole.tange.dk .PP حق نشر (C) 2008\-2010 اوله تانگه (Ole Tange)، http://ole.tange.dk .PP حق نشر (C) 2010\-2026 اوله تانگه (Ole Tange)، http://ole.tange.dk و بنیاد نرم‌افزارهای آزاد (Free Software Foundation, Inc). .PP بخش‌هایی از این راهنما که مربوط به سازگاری با \fBxargs\fR است، از راهنمای \fBxargs\fR در GNU findutils 4.4.2 الهام گرفته شده است. .SH "مجوز (LICENSE)" .IX Header "LICENSE" این برنامه یک نرم‌افزار آزاد است؛ شما می‌توانید آن را تحت شرایط «مجوز عمومی همگانی گنو» (GNU GPL) همان‌طور که توسط بنیاد نرم‌افزارهای آزاد منتشر شده است، بازتوزیع کرده یا تغییر دهید؛ چه نسخه ۳ این مجوز یا (به انتخاب خودتان) هر نسخه بعدی دیگری. .PP این برنامه با این امید توزیع شده است که مفید واقع شود، اما بدون هرگونه ضمانت؛ حتی بدون ضمانت ضمنی قابل فروش بودن یا مناسب بودن برای یک هدف خاص. برای جزئیات بیشتر به «مجوز عمومی همگانی گنو» (GNU GPL) مراجعه کنید. .PP شما باید همراه با این برنامه یک نسخه از مجوز عمومی همگانی گنو را دریافت کرده باشید. در غیر این صورت، ببینید . .SS "مجوز مستندات ۱ (Documentation license I)" .IX Subsection "Documentation license I" اجازه کپی، توزیع و/یا تغییر این مستندات تحت شرایط «مجوز مستندات آزاد گنو» (GNU FDL)، نسخه ۱.۳ یا هر نسخه بعدی منتشر شده توسط بنیاد نرم‌افزارهای آزاد داده می‌شود؛ بدون بخش‌های تغییرناپذیر، بدون متون روی جلد، و بدون متون پشت جلد. نسخه‌ای از این مجوز در فایل 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 "\fBOther 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 \fBparallel\fR از Perl و ماژول‌های پرل Getopt::Long، IPC::Open3، Symbol، IO::File، POSIX و File::Temp استفاده می‌کند. .PP برای \fB\-\-csv\fR از ماژول پرل Text::CSV استفاده می‌کند. .PP برای استفاده راه دور از \fBrsync\fR همراه با \fBssh\fR استفاده می‌کند. .SH "همچنین ببینید (SEE ALSO)" .IX Header "SEE ALSO" \&\fBparallel_tutorial\fR(1), \fBenv_parallel\fR(1), \fBparset\fR(1), \&\fBparsort\fR(1), \fBparallel_alternatives\fR(1), \fBparallel_design\fR(7), \&\fBniceload\fR(1), \fBsql\fR(1), \fBssh\fR(1), \fBssh\-agent\fR(1), \fBsshpass\fR(1), \&\fBssh\-copy\-id\fR(1), \fBrsync\fR(1)