PARALLEL(1) parallel PARALLEL(1) (NAME) parallel - (SYNOPSIS) parallel [] [command [arguments]] < list_of_arguments parallel [] [command [arguments]] ( ::: arguments | :::+ arguments | :::: argfile(s) | ::::+ argfile(s) ) ... parallel --semaphore [] command #!/usr/bin/parallel --shebang [] [command [arguments]] #!/usr/bin/parallel --shebang-wrap [] [command [arguments]] (DESCRIPTION) ! GNU parallel . GNU parallel (jobs) . . (hosts) (URLs) . (pipe) GNU parallel . xargs tee GNU parallel xargs . GNU parallel . GNU parallel . GNU parallel . GNU parallel command . command . . GNU parallel xargs cat | bash . (Reader's guide) GNU parallel : (Tutorial) (how-to) (reference) / (explanation/design). (Tutorial) GNU Parallel 2018 https://www.lulu.com/shop/ole-tange/gnu-parallel-2018/paperback/product-23558902.html https://doi.org/10.5281/zenodo.1146014 . . : https://youtube.com/playlist?list=PL284C9FF2488BC6D1 : (man parallel_tutorial). ! (How-to) man parallel_examples . GNU parallel . (https://www.gnu.org/software/parallel/parallel_options_map.pdf) . (Reference) (cheat sheet) : https://www.gnu.org/software/parallel/parallel_cheat.pdf (man page) . (Design discussion) GNU parallel : man parallel_design. GNU parallel . (OPTIONS) command . command ( {}) . command GNU parallel xargs . command GNU parallel cat | sh . command (alias) . Bash: export -f env_parallel . Bash Csh Tcsh: env_parallel . Zsh Fish Ksh Pdksh: env_parallel . {} . . stdin ( ) --arg-file ::: :::: . {} -I . {} . () . . : --plus {.} {/} {//} {/.} {#} {%} {n} {=perl expression=} {.} . . / . . {.} . foo.jpg foo subdir/foo.jpg subdir/foo sub.dir/foo.jpg sub.dir/foo sub.dir/bar sub.dir/bar . . . {.} --extensionreplace . : {} --extensionreplace {/} (basename) . . : {} --basenamereplace {//} (dirname) . . dirname(1) . : {} --dirnamereplace {/.} (basename) . . {/.} {/} {.} . : {} --basenameextensionreplace {#} . . $PARALLEL_SEQ . : {} --seqreplace {%} ( / alpha testing) (slot) . . . ( --retries --retry-failed) . $PARALLEL_JOBSLOT : $ 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 {%} \$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 {%} \$PARALLEL_JOBSLOT {} ::: A B C D run A {%}=1 PARALLEL_JOBSLOT=1 run C {%}=3 PARALLEL_JOBSLOT=2 run D {%}=1 PARALLEL_JOBSLOT=3 {%} $PARALLEL_JOBSLOT C D . : {} --jobs --slotreplace {n} n n' . n ( --arg-file ::::) n' ( -N --colsep) . n n' . : {} {n.} {n/} {n//} {n/.} --colsep {n.} n n' . {n.} {n} {.} . n ( --arg-file ::::) n' ( -N) . : {n} {.} {n/} (basename) n n' . {n/} {n} {/} . n ( --arg-file ::::) n' ( -N) ( ) . : {n} {/} {n//} (dirname) n n' . {n//} {n} {//} . n ( --arg-file ::::) n' ( -N) . dirname(1) . : {n} {//} {n/.} (basename) n n' . {n/.} {n} {/} {.} . n ( --arg-file ::::) n' ( -N) ( ) . : {n} {/.} {=perl expression=} perl expression. $_ {} . perl expression $_ . $_ GNU parallel . - . GNU parallel : parallel echo '{= $_= ++$wrong_counter =}' ::: a b c : (Shell quote). : parallel echo {} is quoted as '{= $_=Q($_) =}' ::: \$PWD pQ(string) (Perl quote). : parallel echo {} is quoted as '{= $_=pQ($_) =}' ::: \$PWD uq() (or uq) . : parallel echo {} has the value '{= uq =}' ::: \$PWD hash(val) B::hash(val). : parallel echo Hash of {} is '{= $_=hash($_) =}' ::: a b c total_jobs() (jobs). : parallel echo Number of jobs: '{= $_=total_jobs() =}' ::: a b c slot() (alpha testing) (slot) . : parallel echo Job slot of {} is '{= $_=slot() =}' ::: a b c seq() . : parallel echo Seq number of {} is '{= $_=seq() =}' ::: a b c @arg ($arg[1] = {1} = ). : parallel echo {1}+{2}='{=1 $_=$arg[1]+$arg[2] =}' \ ::: 1 2 3 ::: 2 3 4 ('{=1' .) skip() (alpha testing) ( : --filter). : parallel echo '{= $arg[1] >= $arg[2] and skip =}' \ ::: 1 2 3 ::: 2 3 4 yyyy_mm_dd_hh_mm_ss(sec) yyyy_mm_dd_hh_mm(sec) yyyy_mm_dd(sec) hh_mm_ss(sec) hh_mm(sec) yyyymmddhhmmss(sec) yyyymmddhhmm(sec) yyyymmdd(sec) hhmmss(sec) hhmm(sec) . sec (epoch) . . : parallel echo 'Now: {= $_=yyyy_mm_dd_hh_mm_ss() =}' ::: Dummy parallel echo 'The end: {= $_=yyyy_mm_dd_hh_mm_ss($_) =}' \ ::: 2147483648 : seq 10 | parallel echo {} + 1 is {= '$_++' =} parallel csh -c {= '$_="mkdir ".Q($_)' =} ::: '12" dir' seq 50 | parallel echo job {#} of {= '$_=total_jobs()' =} : --rpl --parens {} {=n perl expression=} --filter {=n perl expression=} {=perl expression=}. {n} . : {=perl expression=} {n} {rpl:format} . format rpl . format printf . rpl . : {#:%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 --rpl '{' . : {} {n} --rpl ::: arguments . GNU parallel ::: command . : (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" ::: --arg-sep . ::: . ::: 1 2 ::: a b c (1,a) (1,b) (1,c) (2,a) (2,b) (2,c) . for . ::: :::: --arg-file . : parallel echo {1} {2} {3} ::: 6 7 ::: 4 5 ::: 1 2 3 parallel echo {1} {2} {3} :::: <(seq 6 7) <(seq 4 5) \ :::: <(seq 1 3) parallel -a <(seq 6 7) echo {1} {2} {3} :::: <(seq 4 5) \ :::: <(seq 1 3) parallel -a <(seq 6 7) -a <(seq 4 5) echo {1} {2} {3} \ ::: 1 2 3 seq 6 7 | parallel -a - -a <(seq 4 5) echo {1} {2} {3} \ ::: 1 2 3 seq 4 5 | parallel echo {1} {2} {3} :::: <(seq 6 7) - \ ::: 1 2 3 : --arg-sep --arg-file :::: :::+ ::::+ --link :::+ arguments ::: --link . --link (wrap) : . : parallel echo ::: a b c :::+ 1 2 3 ::: X Y :::+ 11 22 : ::::+ --link :::: argfiles --arg-file argfile1 --arg-file argfile2 ... ::: :::: . : --arg-file ::: ::::+ --link ::::+ argfiles :::: --link . --link : . : --arg-file :::+ --link --null -0 NUL . \n ( ) . \0 (NUL) . \n ( ) . --delimiter '\0'. : --delimiter --arg-file input-file -a input-file input-file . --arg-file input-file . foo 1 2 bar a b c -a foo -a bar (1,a) (1,b) (1,c) (2,a) (2,b) (2,c) . for . input-file + --arg-file . foo 1 2 bar a b -a foo -a +bar --link (1,a) (2,b) . : --link {n} :::: ::::+ ::: --arg-file-sep sep-str sep-str :::: . :::: . : :::: --arg-sep sep-str sep-str ::: . ::: . ::: (stdin) : --arg-sep . : ::: --bar . : . zenity : seq 1000 | parallel -j30 --bar '(echo {};sleep 0.1)' \ 2> >(perl -pe 'BEGIN{$/="\r";$|=1};s/\r/\n/g' | zenity --progress --auto-kill) | wc : --eta --progress --total-jobs --basefile file (beta testing) --bf file (beta testing) file sshlogin . --cleanup . . --bf . file --transferfile . : --sshlogin --transfer --return --cleanup --workdir --basenamereplace replace-str --bnr replace-str replace-str {/} (basename) . : {/} --basenameextensionreplace replace-str --bner replace-str replace-str {/.} . : {/.} --bin binexpr binexpr . binexpr [ | ] [ ] : 3 Address 3 $_%=100 Address s/\D//g --colsep . $_ . (modulo) . --shard () . . bincol (<10) (>100) . --bin --pipe --jobs . : SPREADING BLOCKS OF DATA --group-by --round-robin --shard --bg . GNU parallel . --bg GNU parallel . --semaphore . --semaphore . : --fg man sem --bibtex --citation BibTeX GNU parallel . . --citation --will-cite . --will-cite . GNU parallel . , --will-cite . GNU parallel . man parallel_alternatives . --block size () --block-size size () . size K M G T P k m g t p . GNU parallel . size . size GNU parallel . size 1M . (jobslot) . --block -3 . : * = : parallel --pipe-part -a myfile --block -3 -j5 wc cat myfile | parallel --pipe --block -3 -j5 wc --pipe-part --block --round-robin GNU parallel . --pipe --block : . . --block -size size+1 . : UNIT PREFIX -N --pipe --pipe-part --round-robin --block-timeout --block-timeout duration --bt duration () --pipe. duration . duration s m h d . : TIME POSTFIXES --pipe --block --cat () . --pipe/--pipe-part (stdin) . --cat GNU parallel {} : parallel --pipe --cat wc {}. --pipe --pipe-part . : --pipe --pipe-part --fifo --cleanup () . --cleanup . find log -name '*gz' | parallel \ --sshlogin server.example.com --transferfile {} \ --return {.}.bz2 --cleanup "zcat {} | bzip -9 >{.}.bz2" --transferfile {} . . --return . . --cleanup --basefile --transfer --transferfile --return . : --basefile --transfer --transferfile --sshlogin --return --color . . (+). --color -u . : --color-failed --color-failed --cf . . --color-failed -u --line-buffer --latest-line . : --color --colsep regexp -C regexp . regexp . n {n} {n.} {3} . . {4} : parallel --colsep '-' echo {4} {3} {2} {1} \ ::: A-B C-D ::: e-f g-h --colsep --trim rl --trim n (override) . regexp : https://perldoc.perl.org/perlre.html : --csv {n} --trim --link --match --combineexec name --combine-executable name GNU parallel . myprg . . (wrapper) GNU parallel myparprg: #!/bin/sh parallel myprg ::: "$@" : GNU parallel myprg myparprg. . myprg --embed . myprg --combineexec . gzip : parallel --combineexec pargzip gzip -9 ::: : ./pargzip foo bar baz gzip : parallel --combineexec pargzip gzip : ./pargzip -1 ::: foo bar baz : --embed --shebang --shebang-wrap --compress . $TMPDIR / . GNU parallel pzstd lbzip2 pbzip2 zstd pigz lz4 lzop plzip lzip lrz gzip pxz lzma bzip2 xz clzip . GNU parallel . man parallel_design . : --compress-program --compress-program prg --decompress-program prg prg / . prg -dc (stdin) (stdout) --decompress-program . : --compress --csv CSV. --colsep . --csv --colsep (quotes) . : echo '"1 big, 2 small","2""x4"" plank",12.34' | parallel --csv echo {1} of {2} at {3} echo '"1 big, 2 small","2""x4"" plank",12.34' | parallel --colsep ',' echo {1} of {2} at {3} : (echo '"Start of field 1 with newline' echo 'Line 2 in field 1";value 2') | parallel --csv --colsep ';' echo Field 1: {1} Field 2: {2} --pipe CSV . : --pipe --link {n} --colsep --header --match --ctag (: --color --tag ) . . --ctag . : --color --tag --ctagstring str (: --color --tagstring ) . : --color --ctag --tagstring --delay duration duration. GNU parallel duration . duration s m h d . 'auto' duration ( 13m3sauto) GNU parallel : duration . duration . : TIME POSTFIXES --retries --ssh-delay --delimiter delim -d delim delim . C \n (\012) (\x0A) . printf . : --colsep --dirnamereplace replace-str --dnr replace-str replace-str {//} (dirname) . : {//} --dry-run () (stdout) . -v -v GNU parallel ( --tmux --nice --pipe --pipe-part --fifo --cat). : . : -v -E eof-str eof-str. . -E -e . --eof[=eof-str] -e[eof-str] -E . -E xargs POSIX . eof-str . -E -e . --embed GNU parallel . GNU parallel GNU parallel : parallel --embed > new_script new_script . ash bash dash ksh sh zsh . --env var (alpha testing) export var. var . . Bash var Bash - export -f (export) . '_' . export ~/.parallel/ignored_vars . ( export ) env_parallel . : --record-env --session --sshlogin command env_parallel --eta . GNU parallel ( --total-jobs ). GNU parallel . . --progress . : --bar --progress --total-jobs --extensionreplace replace-str --er replace-str replace-str {.} . : {.} --fast (alpha testing) . GNU parallel : . . : # ~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 : {} --compress/--compress-program --dry-run --jobs --keep-order --nice --tag --tagstring ( {}) --ungroup. ( . ): : {.} {/} {//} {/.} {#} {%} {n}. --tagstring {}. ( :::) -a/--arg-file ::::. --null/-0 -d/--delimiter --colsep/-C --csv --link/:::+/::::+ -N ( N>1) -m -X --filter --trim ( n). -E/--eof: . : --group (): ( ) . stdout stderr . --halt/--halt-on-error: . 0 --halt --halt never . {=perl=}: ( slot()) . --joblog/--jl: (truncate) . --env: fork parallel . : --timeout: . --bar/--eta/--progress: parallel . --delay: . --retries: . --load/--limit/--memfree/--noswap: . : --results/-o: . --tty: stdin ( ) /bin/sh . -L/--max-lines/-l: . --verbose/-t: stderr . --total-jobs: . : --pipe/--pipepart/--tee/--fifo/--cat/--header/--group-by: --fast. SSH/ (--sshlogin --sshloginfile/--slf --basefile/--bf --transfer --return --cleanup --trc --filter-hosts --workdir --hostgroups): --fast (local) . --tmux/--tmuxpane/--bg/--fg/--wait/--semaphore: . : . parallel_design . --fg . --tmux --tmuxpane GNU parallel tmux . --semaphore GNU parallel ( --bg) . . : --bg man sem --fifo (alpha testing) fifo . --pipe --pipe-part stdin ( ) . --fifo GNU parallel fifo {} : parallel --pipe --fifo wc {} : fifo (block) : seq 1000000 | parallel --fifo echo This will block forever seq 1000000 | parallel --fifo 'echo This will not block < {}' --fifo --cat I/O --cat --fifo . --pipe --pipe-part . : --cat --pipe --pipe-part --filter filter (alpha testing) filter (true) . filter Perl . : parallel --filter '{1}+{2}+{3} < 10' echo {1},{2},{3} \ ::: {1..10} ::: {3..8} ::: {3..10} : 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 parallel --filter '{1} < {2}*{2}' echo {1},{2} \ ::: {1..10} ::: {1..3} : 1,2 1,3 2,2 2,3 3,2 3,3 4,3 5,3 6,3 7,3 8,3 parallel --filter '{choose_k}' --plus echo {1},{2},{3} \ ::: {1..5} ::: {1..5} ::: {1..5} : 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 : skip() --no-run-if-empty {choose_k} --filter-hosts (beta testing) (down). : ssh . : . --sshloginfile . --sshloginfile --retries . --filter-hosts $PARALLEL /etc/parallel/config . GNU parallel GNU parallel . . : --sshloginfile --sshlogin --retries --gnu GNU parallel. --tollef . --tollef . --gnu . --group . . stdout ( ) stderr ( ). . CPU . --group . --fast: ( ). stdout stderr ( ) parallel stdout stderr . --tag . : --line-buffer --ungroup --tag --group-by val (alpha testing) . --pipe/--pipe-part --group-by . . val : . . ( --pipe-part ). perl perl $_ . perl $_ perl $_ . perl $_ perl $_ . ( --pipe-part ). : UserID, Consumption 123, 1 123, 2 12-3, 1 221, 3 221, 1 2/21, 5 123 12-3 221 2/21 wc : tail -n +2 table.csv | \ parallel --pipe --colsep , --group-by 1 -kN1 wc GNU parallel : cat table.csv | \ parallel --pipe --colsep , --header : --group-by 1 -kN1 wc : cat table.csv | \ parallel --pipe --colsep , --header : --group-by UserID -kN1 wc 12-3 123 UserID UserID : cat table.csv | parallel --pipe --colsep , --header : \ --group-by 'UserID s/\D//g' -kN1 wc : SPREADING BLOCKS OF DATA --pipe --pipe-part --bin --shard --round-robin --help -h GNU parallel . --halt-on-error val --halt val GNU parallel . GNU parallel . val never . val when,why . when 'now' (kill) 'soon' . why 'fail=X' 'fail=Y%' 'success=X' 'success=Y%' 'done=X' 'done=Y%' X Y . : --halt now,fail=1 . . --halt soon,fail=3 . --halt soon,fail=3% . --halt now,success=1 . . --halt soon,success=3 . --halt now,success=3% . . --halt now,done=1 . . --halt soon,done=3 . --halt now,done=3% . . : 0 never 1 soon,fail=1 2 now,fail=1 -1 soon,success=1 -2 now,success=1 1-99% soon,fail=1-99% --header regexp (regexp) (header). ( : --header '.*\n') --colsep ( '\t' ) : {column name} {column name/} {column name//} {column name/.} {column name.} {=column name perl expression =} .. --pipe . --header : --header '.*\n' . regexp . --header 0 : --arg-file :::: . {foo/bar} foo/bar . : --colsep --pipe --pipe-part --arg-file --hostgroups --hgrp (hostgroups) . '@' '@' . --sshlogin . : parallel --hostgroups \ --sshlogin @grp1/myserver1 -S @grp1+grp2/myserver2 \ --sshlogin @grp3/myserver3 \ echo ::: my_grp1_arg@grp1 arg_for_grp2@grp2 third@grp1+grp3 my_grp1_arg myserver1 myserver2 third myserver1 myserver3 arg_for_grp2 myserver2 . : --sshlogin $PARALLEL_HOSTGROUPS $PARALLEL_ARGHOSTGROUPS -I replace-str replace-str {}. : {} --replace [replace-str] -i [replace-str] -I . replace-str -Ireplace-str -I {} . : {} --joblog logfile --jl logfile (logfile) . logfile TAB : sshlogin (epoch) . --pipe . logfile '+' . ISO-8601 : cat logfile | perl -a -F"\t" -ne \ 'chomp($F[2]=`date -d \@$F[2] +%FT%T`); print join("\t",@F)' column -t : cat joblog | column -t : --resume --resume-failed --progress --jobs num -j num --max-procs num -P num (jobslots) . num . 100% . num num . 0 ( ). -j 0 jobslot : # This will not count from 1 but from number-of-jobslots seq 10000 | parallel -j0 echo '{= $_ = $foo++; =}' | head # This will count from 1 seq 10000 | parallel -j100 echo '{= $_ = $foo++; =}' | head num% (CPU threads) num . 100% thread . +num num . -num num . expr expr. '12/2' 6 '+25%' '125%' '+3*log(55)%' : log(55) . . procfile . procfile -j. procfile 100% +2 10 . procfile procfile . . GNU parallel . numauto num auto GNU parallel . GNU parallel . GNU parallel . GNU parallel . : # 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 'sleep 2.${RANDOM}{}12345; n_sleeps 5' ::: {1..100} . sleep . GNU parallel . . --semaphore mutex . : --use-cores-instead-of-threads --use-sockets-instead-of-threads --keep-order (alpha testing) -k (alpha testing) . . : parallel -j4 sleep {}\; echo {} ::: 2 1 4 3 parallel -j4 -k sleep {}\; echo {} ::: 2 1 4 3 --onall --nonall sshlogin . --keep-order --pipe --round-robin . (jobslots) . : seq 10000000 | parallel --pipe --round-robin 'sleep 0.$RANDOM; wc' seq 10000000 | parallel --pipe -k --round-robin 'sleep 0.$RANDOM; wc' -k - . : --group --line-buffer -L recsize --pipe: recsize. : recsize . . -L 0 . recsize K M G T P k m g t p . -X -m --xargs --pipe . : UNIT PREFIX -N --max-lines --block -X -m --xargs --pipe --max-lines [recsize] -l[recsize] --pipe: recsize . : -L. -L recsize . recsize . -l POSIX -L . -l 0 -l 1 . -X -m --xargs --pipe . : UNIT PREFIX -N --block -X -m --xargs --pipe --limit "command args" . command args . command GNU parallel : 0 . . 1 . . 2 . . . : "io n" I/O. I/O 0-100 0 I/O 100 . "load n" --load. "mem n" --memfree. : --memfree --load --latest-line --ll . . . . . : slow_seq() { # Run seq with 33 characters per second seq "$@" | perl -ne '$|=1; for(split//){ print; select($a,$a,$a,0.03);}' } export -f slow_seq parallel --shuf -j99 --ll --tag --bar --color slow_seq {} ::: {1..300} : --line-buffer --line-buffer --lb . --group . --ungroup . --line-buffer : GNU parallel . --line-buffer CPU --group --ungroup CPU --group . --line-buffer --keep-order --results --compress --files . --group . --keep-order --line-buffer . . : parallel -j0 'echo [{};sleep {};echo {}]' ::: 1 3 2 4 parallel -j0 --lb 'echo [{};sleep {};echo {}]' ::: 1 3 2 4 parallel -j0 -k --lb 'echo [{};sleep {};echo {}]' ::: 1 3 2 4 : --group --ungroup --keep-order --tag --link --xapply . xapply. . {1} {n} {1} {6} . : parallel echo {1} {2} ::: 1 2 3 ::: a b c parallel --link echo {1} {2} ::: 1 2 3 ::: a b c ( ) : parallel --link echo {1} {2} {3} \ ::: 1 2 ::: I II III ::: a b c d e f g : --header :::+ ::::+ --load max-load (load) max-load . max-load . max-load --jobs 100% CPU . 0 0.01 . : --limit --jobs --controlmaster -M ControlMaster ssh ssh. (remote) . sshlogin ssh . : --ssh --sshlogin -m . . : . -j1 --xargs . {} . {} . -m --sshlogin . -X . : -X --xargs --match regexp regexp . --match awk . (capture group) '(...)' . {m.n} m n : parallel --match '(.*),(.*)_(.*)' echo {1.2} {1.3} {1.1} \ ::: Gold,Heart_of parallel --match '(.*),' --match '([a-z]+)' echo {1.1}{2.1} \ ::: Milli,bar ::: 10ways --match +n n . +2 : parallel --match +2 --match '([A-Za-z]+)' echo {1.1} {2.1} \ ::: /Improbability/ ::: 10drive --match --match : parallel --match '' --match '([a-z]+)' echo {1} {2.1} \ ::: Telephone ::: 10sanitizer : {n} --colsep --memfree size . size K M G T P k m g t p . RAM GNU parallel . size . 50% size ( --term-seq) (killed) . : UNIT PREFIX --term-seq --memsuspend --memsuspend size . 2 * size GNU parallel (suspend) . size . . swap size - swap. RAM - - (resume). --memsuspend (local) (remote) . size K M G T P k m g t p . : UNIT PREFIX --memfree --milestone str (milestones) . : 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 (a, b, c) (1, 2) (A, B) (I, II, III) . () . . : parallel --tag --milestone // doit ::: Frist_run // Second_run ::: file{1..10} First_run Second_run . ( ): parallel --tag --milestone // doit ::: a b // 1 2 3 ::: A B C // I II : [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). . : [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). --minversion version GNU parallel . GNU parallel version 255 . 0 . GNU parallel : parallel --minversion 20170422 && echo halt done=50% supported from version 20170422 && parallel --halt now,done=50% echo ::: {1..100} : --version --max-args max-args -n max-args max-args . ( -s ) max-args -x GNU parallel . -n 0 0 . max-args K M G T P k m g t p ( UNIT PREFIX ). -X -m . : -X -m --xargs --max-replace-args --max-replace-args max-args -N max-args max-args . -n {1} {max-args} 1 max-args . {n} . -N 0 0 . (homedir) : tr ':' '\n' < /etc/passwd | parallel -N7 chown {1} {6} -X -m --pipe . max-args K M G T P k m g t p . --pipe -N . --block . : UNIT PREFIX --pipe --block -m -X --max-args --nonall ( ) --onall . --sshlogin . GNU parallel --jobs . -j . ( uptime) . : --onall --sshlogin --onall ( ) --sshlogin. GNU parallel --jobs . . --group . --joblog (job sequence 1) . : --nonall --sshlogin --open-tty -o tty . --tty --jobs --ungroup . : --tty --output-as-files --outputasfiles --files --files0 . stdout ( ) . --files0 NUL (\0) (\n) . : --results --pipe ( ) --spreadstdin ( ) stdin ( ). stdin ( ) . --block (: 1M). GNU parallel . --recstart --recend : --recend --recstart . GNU parallel --recend --recstart . . . -N -L . --pipe . --pipe-part . --fifo --cat stdin ( ) fifo . --block-timeout . --round-robin --bin --shard --group-by . (SPREADING BLOCKS OF DATA) . : --block --block-timeout --recstart --recend --fifo --cat --pipe-part -N -L --round-robin --pipe-part ( ) . --pipe-part --pipe . . --pipe-part : o ( /seekable) --arg-file :::: . fifo . NUL --recend '' . o (-N) (-L/-l) . --recstart --recend . : --pipe --recstart --recend --arg-file :::: --plain --profile $PARALLEL ~/.parallel/config. --profile $PARALLEL ~/.parallel/config ( GNU parallel --sshlogin ). : $PARALLEL ( --blocksize --timeout --delay). -- setuid sudo $PARALLEL -- --plain $PARALLEL ( ) . root : #!/bin/sh exec parallel --plain "$@" : --profile --plus . : {+/} {+.} {+..} {+...} {..} {...} {/..} {/...} {##}. '{+foo}' '{foo}' : {} = {+/}/{/} = {.}.{+.} = {+/}/{/.}.{+.} = {..}.{+..} = {+/}/{/..}.{+..} = {...}.{+...} = {+/}/{/...}.{+...} {##} . -X/-m/--xargs . {0%} (jobslot) (zero-padded). {0#} (zero-padded). {slot-1} - ( ). {seq-1} - ( ). {choose_k} << k n>> (n choose k) : n k . k n . . {uniq} . : {slot} $PARALLEL_JOBSLOT (see {%}) {sshlogin} $PARALLEL_SSHLOGIN {host} $PARALLEL_SSHHOST {agrp} $PARALLEL_ARGHOSTGROUPS {hgrp} $PARALLEL_HOSTGROUPS . bash (parameter expansion) : {:-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 : --rpl {} --process-slot-var varname varname (jobslot number-1). seq 10 | parallel --process-slot-var=name echo '$name' {} --progress . . : . GNU parallel -- . SIGUSR2 GNU parallel / --progress GNU parallel . : --eta --bar --joblog --max-line-length-allowed . ( GNU parallel ). : --show-limits --number-of-cpus () CPU . --number-of-cores CPU ( GNU parallel CPU ). : --number-of-sockets --number-of-threads --use-cores-instead-of-threads --jobs --number-of-sockets CPU ( GNU parallel CPU ). : --number-of-cores --number-of-threads --use-sockets-instead-of-threads --jobs --number-of-threads (hyperthreaded) CPU ( GNU parallel CPU ). : --number-of-cores --number-of-sockets --jobs --no-keep-order --keep-order ( ~/.parallel/config ). --nice niceness (niceness). GNU parallel nice GNU parallel -- . --nice nice . nice ( --nice 5 ). --interactive -p . . 'y' 'Y' . -t . --_parset type,varname parset . eval () varname . type 'assoc' 'var' . parset . --parens parensstring parensstring {==}. {=perl expression=}. . {==} {= =} . ,,,, ,, : parallel --parens ,,,, echo foo is ,,s/I/O/g,, ::: FII : --rpl {=perl expression=} --profile profilename -J profilename profilename . . . profilename ~/.parallel/profilename . --profile . . : ~/.parallel/config : (PROFILE FILES) --quote -q command. ( ; \ | *) --quote . ( man bash ) (redirections) . . . : (QUOTING) command --shell-quote uq() Q().IP --no-run-if-empty 4 -r . (stdin) (whitespace) . --pipe . : command --pipe --interactive --noswap (swap) . (swap-in) (swap-out) . swap . swap (swap-in)*(swap-out) : swap-out swap-in swap-in swap-out . --memfree --memsuspend . : --memfree --memsuspend --record-env . (exported) ~/.parallel/ignored_vars . --env _ . / --record-env . : --env --session env_parallel --recstart startstring --recend endstring endstring startstring. --recstart startstring . --recend endstring . --recstart --recend endstringstartstring . startstring endstring . --recstart --recend --recend '\n' . ( ) --recend "" . --recstart --recend --pipe . --regexp --recstart --recend (regular expressions) . . --recstart --recend --remove-rec-sep . : --pipe --regexp --remove-rec-sep --regexp --regexp --recstart --recend (regular expressions) . . : --pipe --regexp --remove-rec-sep --recstart --recend --remove-rec-sep --removerecsep --rrs . --recstart --recend . --pipe/--pipe-part . : --pipe --regexp --pipe-part --recstart --recend --results name --res name . name .csv/.tsv name . : name//stdout name//stderr name//seq ( --header :) . : parallel --header : --results foo echo {a} {b} \ ::: a I II ::: b III IIII : 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 parallel --results foo echo {1} {2} ::: I II ::: III IIII : 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 CSV name .csv/.tsv CSV name . .csv .tsv TAB . -.csv/-.tsv : (stdout) . JSON name .json JSON name . -.json : (stdout) . name / . '.err' '.seq' . : parallel --results my_{} echo ::: foo bar baz : my_bar my_bar.err my_bar.seq my_baz my_baz.err my_baz.seq my_foo my_foo.err my_foo.seq name / . : parallel --results my_{}/ echo ::: foo bar baz : 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 : --output-as-files --tag --header --joblog --resume . --joblog --results parallel . parallel --joblog --joblog parallel . : --joblog --results --resume-failed --retries --resume-failed . --joblog parallel . . parallel --joblog --joblog parallel . : --joblog --resume --retry-failed --retries --retry-failed joblog. --joblog parallel . --retry-failed : joblog . --resume --resume-failed --retry-failed exit {= $_%=2 =} . timeout -k 1 4 parallel --joblog log -j10 \ 'sleep {}; exit {= $_%=2 =}' ::: {10..1} : 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 --resume Exitval Seq . Seq . : parallel --resume --joblog log -j10 \ 'sleep .{}; exit {= $_%=2 =}' ::: {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 --resume-failed Exitval Seq . . : parallel --resume-failed --joblog log -j10 \ 'echo {};sleep .{}; exit {= $_%=3 =}' ::: {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 --retry-failed Exitval joblog . : 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 : --joblog --resume --resume-failed --retries --retries n (beta testing) n . . n . --sshlogin n parallel . ( ) . n=0 . : --term-seq --sshlogin --return filename (beta testing) . --return --sshlogin . filename rsync . : echo foo/bar.txt | parallel --return {.}.out \ --sshlogin server.example.com touch {.}.out $HOME/foo/bar.out server.example.com touch foo/bar.out server.example.com foo/bar.out . parallel -S server --trc out/./{}.out touch {}.out ::: in/file in/file.out server.example.com touch in/file.out server out/in/file.out . echo /tmp/foo/bar.txt | parallel --return {.}.out \ --sshlogin server.example.com touch {.}.out /tmp/foo/bar.out server.example.com touch /tmp/foo/bar.out server.example.com /tmp/foo/bar.out . : echo /tmp/foo/bar.txt | parallel \ --sshlogin server.example.com \ --return {.}.out --return {.}.out2 touch {.}.out {.}.out2 --sshlogin : --sshlogin --return . --transferfile . : --transfer --transferfile --sshlogin --cleanup --workdir --round-robin (alpha testing) --round (alpha testing) (round robin). --pipe . --round-robin . . --keep-order --round-robin . --keep-order . --round-robin --pipe --pipe-part . SPREADING BLOCKS OF DATA . : --bin --group-by --shard --rpl 'tag perl expression' . tag perl expression. . GNU parallel : --rpl '{} ' --rpl '{#} 1 $_=$job->seq()' --rpl '{%} 1 $_=$job->slot()' --rpl '{/} s:.*/::' --rpl '{//} $Global::use{"File::Basename"} ||= eval "use File::Basename; 1;"; $_ = dirname($_);' --rpl '{/.} s:.*/::; s:\.[^/.]+$::;' --rpl '{.} s:\.[^/.]+$::' --plus : --rpl '{+/} s:/[^/]*$:: || s:.*$::' --rpl '{+.} s:.*\.:: || s:.*$::' --rpl '{+..} s:.*\.([^/.]+\.[^/.]+)$:$1: || s:.*$::' --rpl '{+...} s:.*\.([^/.]+\.[^/.]+\.[^/.]+)$:$1: || s:.*$::' --rpl '{..} s:\.[^/.]+\.[^/.]+$::' --rpl '{...} s:\.[^/.]+\.[^/.]+\.[^/.]+$::' --rpl '{/..} s:.*/::; s:\.[^/.]+\.[^/.]+$::' --rpl '{/...} s:.*/::; s:\.[^/.]+\.[^/.]+\.[^/.]+$::' --rpl '{choose_k} for $t (2..$#arg){ if($arg[$t-1] ge $arg[$t]) { skip() } }' --rpl '{##} 1 $_=total_jobs()' --rpl '{0%} 1 $f=1+int((log($Global::max_jobs_running||1)/ log(10))); $_=sprintf("%0${f}d",slot())' --rpl '{0#} 1 $f=1+int((log(total_jobs())/log(10))); $_=sprintf("%0${f}d",seq())' --rpl '{seq(.*?)} $_=eval q{$job->seq()}.qq{$$1}' --rpl '{slot(.*?)} $_=eval q{$job->slot()}.qq{$$1}' --rpl '{:-([^}]+?)} $_ ||= $$1' --rpl '{:(\d+?)} substr($_,0,$$1) = ""' --rpl '{:(\d+?):(\d+?)} $_ = substr($_,$$1,$$2);' --rpl '{#([^#}][^}]*?)} $nongreedy=::make_regexp_ungreedy($$1); s/^$nongreedy(.*)/$1/;' --rpl '{##([^#}][^}]*?)} s/^$$1//;' --rpl '{%([^}]+?)} $nongreedy=::make_regexp_ungreedy($$1); s/(.*)$nongreedy$/$1/;' --rpl '{%%([^}]+?)} s/$$1$//;' --rpl '{/([^}]+?)/([^}]*?)} s/$$1/$$2/;' --rpl '{^([^}]+?)} s/^($$1)/uc($1)/e;' --rpl '{^^([^}]+?)} s/($$1)/uc($1)/eg;' --rpl '{,([^}]+?)} s/^($$1)/lc($1)/e;' --rpl '{,,([^}]+?)} s/($$1)/lc($1)/eg;' --rpl '{slot} 1 $_="\${PARALLEL_JOBSLOT}";uq()' --rpl '{host} 1 $_="\${PARALLEL_SSHHOST}";uq()' --rpl '{sshlogin} 1 $_="\${PARALLEL_SSHLOGIN}";uq()' --rpl '{hgrp} 1 $_="\${PARALLEL_HOSTGROUPS}";uq()' --rpl '{agrp} 1 $_="\${PARALLEL_ARGHOSTGROUPS}";uq()' '{' ( {2.}) . $_ GNU parallel . : Is the job sequence even or odd? --rpl '{odd} $_ = seq() % 2 ? "odd" : "even"' Pad job sequence with leading zeros to get equal width --rpl '{0#} $f=1+int("".(log(total_jobs())/log(10))); $_=sprintf("%0${f}d",seq())' Job sequence counting from 0 --rpl '{#0} $_ = seq() - 1' Job slot counting from 2 --rpl '{%1} $_ = slot() + 1' Remove all extensions --rpl '{:} s:(\.[^/]+)*$::' . $$1 : parallel --rpl '{%(.*?)} s/$$1//' echo {%.tar.gz} ::: my.tar.gz parallel --rpl '{:+(.+?)} s:$$1(\.[^/]+)*$::' \ echo {:+_file} ::: my_file.tar.gz parallel -n3 --rpl '{/:+(.*?)} s:.*/(.*)$$1(\.[^/]+)*$:$1:' \ echo job {#}: {2} {2.} {3/:+_1} ::: a/b.c c/d.e f/g_1.h.i : parallel --rpl '{/(.+?)/(.*?)} s/$$1/$$2/;' echo {/replacethis/withthis} {/b/C} ::: a_replacethis_b parallel --rpl '{(.*?)/(.*?)} $_="$$2$_$$1"' \ echo {swap/these} ::: -middle- : {=perl expression=} --parens --rsync-opts options rsync. --rsync-opts $PARALLEL_RSYNC_OPTS . --max-chars max-chars -s max-chars . max-chars (initial-arguments) null . exec . . K M G T P k m g t p max-chars ( UNIT PREFIX ). -X -m --xargs . : -X -m --xargs --max-line-length-allowed --show-limits --show-limits . -s . GNU parallel dev/null/ ( --no-run-if-empty ). : --max-chars --max-line-length-allowed --version --semaphore (counting semaphore). --semaphore GNU parallel command . --jobs GNU parallel . --semaphore --bg --fg . sem (alias) parallel --semaphore . : man sem --bg --fg --semaphore-name --semaphore-timeout --wait --semaphore-name name --id name name . tty ( tty). name . $$ my_task_name . ~/.parallel/semaphores/ . --semaphore . : man sem --semaphore --semaphore-timeout secs --st secs 0 < secs: secs . 0 > secs: secs . secs s m h d ( TIME POSTFIXES ). --semaphore . : man sem --seqreplace replace-str replace-str {#} . : {#} --session $PARALLEL_IGNORED_NAMES . env_parallel . $PARALLEL_IGNORED_NAMES . / --session . --record-env . Ash, Bash, Dash, Ksh, Sh, and Zsh . : --env --record-env env_parallel --shard shardexpr shardexpr (shard) . shardexpr [column number|column name] [perlexpression] : 3 Address 3 $_%=100 Address s/\d//g --colsep . $_ . . shardcol ( 10) ( 100) . --shard --pipe --jobs . SPREADING BLOCKS OF DATA . : --bin --group-by --round-robin --shebang --hashbang GNU parallel (#!) . (inputsource) . : #!/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 --shebang . FreeBSD env : #!/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 (#!) . https://www.in-ulm.de/~mascheck/various/shebang . : --shebang-wrap --shebang-wrap GNU parallel shebang . : cat arguments | parallel the_program : #!/usr/bin/parallel --shebang-wrap /original/parser --options : #!/usr/bin/parallel --shebang-wrap /usr/bin/python : cat data | parallel --pipe the_program : #!/usr/bin/parallel --shebang-wrap --pipe /orig/parser --opts : #!/usr/bin/parallel --shebang-wrap --pipe /usr/bin/perl -w --shebang-wrap . : --shebang --shell-completion shell (shell completion) . : bash zsh. auto shell . : zsh% eval "$(parallel --shell-completion auto)" bash$ eval "$(parallel --shell-completion auto)" `/usr/share/zsh/site-functions/_parallel` `compinit` `~/.zcompdump` : #compdef parallel (( $+functions[_comp_parallel] )) || eval "$(parallel --shell-completion auto)" && _comp_parallel --shell-quote () . GNU parallel . --shell-quote parallel --shell-quote | parallel --shell-quote parallel --shell-quote --shell-quote . : --quote --shuf (shuffle) . . --shuf . . --halt soon,done=1% : parallel --shuf --halt soon,done=1% echo ::: {1..100} ::: {1..100} : --halt --skip-first-line ( GNU parallel --shebang ). --sql DBURL () --sql-master . --sql-master DBURL SQL. DBURL --joblog ( V1 .. Vn) ( Stdout Stderr) . DBURL '+' GNU parallel . DBURL '+' (drop) V --sqlmaster . --sqlworker . --wait GNU parallel . DBURL : [sql:]vendor://[[user][:pwd]@][host][:port]/[db]/[table] : 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://// / sqlite CSV %2F / CSV / . db table $USER: pg://// = pg:///$USER/$USER (alias) ~/.sql/aliases : :myalias mysql:///mydb/paralleljobs : --sql-and-worker --sql-worker --joblog --sql-and-worker DBURL : --sql-master DBURL --sql-worker DBURL. : --sql-master --sql-worker --sql-worker DBURL SQL. DBURL . command --sqlmaster . --sqlworker . --sqlworker SQL ':' . : --sql-master --sql-and-worker --ssh sshcommand ( ) GNU parallel ssh . --ssh . --sshlogin . : --sshlogin --ssh-delay duration ssh duration. GNU parallel duration ssh . duration s m h d . : TIME POSTFIXES --sshlogin --delay --sshlogin [@hostgroups/][ncpus/][[user][:[password]]@]host[:port][,...] ( ) --sshlogin @hostgroup/ -S [@hostgroups/][ncpus/][ssh command][[user][:[password]]@]host[:port][,...] ( ) -S @hostgroup/ . . @hostgroups/ sshlogin . '+' . sshlogin (hostgroup) sshlogin . @hostgroup sshlogin . @hostgroup . : --hostgroup. : @prod/ @dev+remote/ ncpus/ (threads) . GNU parallel -j . ncpus GNU parallel . ncpus . : 4/ 12/ ssh command ssh command . ssh command . : /usr/bin/lsh -z autossh -C user . . : alice bob :password password ( sshpass). password . password GNU parallel $SSHPASS . : ssh . (ssh-agent ssh-copy-id ). : :mypassword : host IP . ( ). : server01 10.1.2.3 [2001:470:142:4::a] 2001:470:142:5::116. [] : server[1,3,8-10] ( server1, server3, server8, server9, server10) server[001,003,008-010] ( server001, server003, server008, server009, server010). -S{dev,prod}[001-100] -Sdev[001-100] -Sprod[001-100] . [] : server[01-10].cluster[1-5].example.net :port () . : :22 :2222. IPv6 p # : . : [2001:470:142:4::a]:2222 2001:470:142:5::116p2222 2001:470:142:5::116#22222 : : ' ssh' . .. sshlogin ~/.parallel/sshloginfile $XDG_CONFIG_HOME/parallel/sshloginfile - sshlogin stdin ( ). sshlogin ( ) . GNU parallel , () sshlogin , () \, ,, . --sshloginfile . GNU parallel . --sshlogin -m -X . : --basefile --transferfile --return --cleanup --trc --sshloginfile --workdir --filter-hosts --ssh --sshloginfile filename ( ) --slf filename ( ) sshlogin. sshlogin . '#' . : 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 'ssh -p 2222 server3' in hostgroup1 @hostgroup1/4/ssh -p 2222 server3 # TODO example with ,, ssh . --sshloginfile . GNU parallel ~/.parallel . : .. sshlogin ~/.parallel/sshloginfile . sshlogin /etc/parallel/sshloginfile - sshlogin (stdin). sshloginfile ( ). . (daemon) sshloginfile : cp original.slf tmp2.slf while [ 1 ] ; do nice parallel --nonall -j0 -k --slf original.slf \ --tag echo | perl 's/\t$//' > tmp.slf if diff tmp.slf tmp2.slf; then mv tmp.slf tmp2.slf fi sleep 10 done & parallel --slf tmp2.slf ... : --filter-hosts --slotreplace replace-str replace-str {%} . : {%} --silent . . . -v . : -v --template file=repl --tmpl file=repl file repl. file . repl . --cleanup . my.tmpl : Xval: {x} Yval: {y} FixedValue: 9 # x with 2 decimals DecimalX: {=x $_=sprintf("%.2f",$_) =} TenX: {=x $_=$_*10 =} RandomVal: {=1 $_=rand() =} : myprog() { echo Using "$@"; cat "$@"; } export -f myprog parallel --cleanup --header : --tmpl my.tmpl={#}.t myprog {#}.t \ ::: x 1.234 2.345 3.45678 ::: y 1 2 3 : {} --cleanup --tty tty. GNU parallel tty ( ) . ( -j1) ( -u) tty . -j1 -u . --tty GNU parallel ( --timeout --memfree --halt). GNU parallel . tty . : --ungroup --open-tty --tag . (\t) . --onall --nonall sshlogin . -u --tag . : --tagstring --ctag --tagstring str . str (\t) . str {} . -u --onall --nonall --tagstring . : --tag --ctagstring --tee (alpha testing) (pipe) . --pipe/--pipe-part ::: . seq 1000 | parallel --pipe --tee -v wc {} ::: -w -l -c : seq 1000 | parallel --pipe --tee --tag \ 'grep {1} | wc {2}' ::: {0..9} ::: -l -c a z parallel -a /usr/share/dict/words --pipe-part --tee --tag \ 'grep {1} | wc {2}' ::: {a..z} ::: -l -c : ::: --pipe --pipe-part --term-seq sequence (termination sequence). --timeout --memfree --halt GNU parallel sequence . : TERM,200,TERM,100,TERM,50,KILL,25 TERM TERM TERM KILL . GNU parallel . : --halt --timeout --memfree --total-jobs jobs --total jobs (ETA) --bar . --total-jobs GNU Parallel . --total-jobs . : --bar --eta --tmpdir dirname . GNU parallel /tmp . --tmpdir . --tmpdir $TMPDIR . : --compress $TMPDIR $PARALLEL_REMOTE_TMPDIR --tmux (alpha testing) tmux . (session) tmux . . : --tmuxpane --tmuxpane (alpha testing) tmux (panes) . . : --tmux --timeout duration (timeout) . duration --term-seq . duration % . > 100% . duration s m h d . : TIME POSTFIXES --term-seq --retries --verbose -t (stderr). : -v --interactive --transfer (beta testing) . : --transferfile {}. : --transferfile. --transferfile filename (beta testing) --tf filename filename . --transferfile --sshlogin . rsync (work dir) . filename . /./ ( : rsync ). /home/user : /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 foo/bar.txt wc foo/bar.txt server.example.com server.example.com $HOME/foo/bar.txt : echo foo/bar.txt | parallel --transferfile {} \ --sshlogin server.example.com wc /tmp/foo/bar.txt wc /tmp/foo/bar.txt server.example.com server.example.com /tmp/foo/bar.txt : echo /tmp/foo/bar.txt | parallel --transferfile {} \ --sshlogin server.example.com wc /tmp/foo/bar.txt wc ./foo/bar.txt server.example.com server.example.com foo/bar.txt : echo /tmp/./foo/bar.txt | parallel --transferfile {} \ --sshlogin server.example.com wc {= s:.*/\./:./: =} --transferfile --return --cleanup . --transferfile {} --transfer . --transferfile --sshlogin : --sshlogin . : --workdir --sshlogin --basefile --return --cleanup --trc filename (Transfer, Return, Cleanup). : --transfer --return filename --cleanup : --transfer --return --cleanup --trim (white space) . n . . . l . . : " a bc " -> "a bc ". r . . : " a bc " -> " a bc". lr rl . . : " a bc " -> "a bc". --colsep . : --no-run-if-empty {} --colsep --ungroup -u ( ) . GNU parallel . . : seq 4 | parallel -j0 \ 'sleep {};echo -n start{};sleep {};echo {}end' seq 4 | parallel -u -j0 \ 'sleep {};echo -n start{};sleep {};echo {}end' --tag . GNU parallel -u . : parallel seq ::: 300000000 >/dev/null parallel -u seq ::: 300000000 >/dev/null parallel --line-buffer seq ::: 300000000 >/dev/null --group . : --line-buffer --group --unsafe GNU parallel . --unsafe GNU parallel . Shellshock : https://en.wikipedia.org/wiki/Shellshock_(software_bug) --unsafe . --use-sockets-instead-of-threads : --use-cores-instead-of-threads --use-cores-instead-of-threads --use-cpus-instead-of-cores (obsolete) GNU parallel CPU . GNU parallel (--jobs) CPU ( %100 +1). (CPU) : sockets CPU ( ). cores ( ). threads Hyper-Threading ( - hyperthreaded ). CPU (threads) . --use-sockets-instead-of-threads --use-cores-instead-of-threads . . --use-cpus-instead-of-cores () --use-sockets-instead-of-threads . : --number-of-threads --number-of-cores --number-of-sockets -v (Verbose). stdout ( ) . --silent . -v -v ssh . : -t --version -V GNU parallel . --workdir mydir --wd mydir mydir . (login dir) . --transferfile --return mydir . ... mydir ~/.parallel/tmp/ . --cleanup . . mydir . (home dir) . . ( ) . : parallel -S server pwd ::: "" parallel --wd . -S server pwd ::: "" parallel --wd ... -S server pwd ::: "" mydir GNU parallel . --wait . --semaphore --sqlmaster . : man sem -X (context replace). . : . -j1 . {} . {} ( pic{}.jpg) . {} {} . -X {} -m . -X --sshlogin . : -m --exit -x ( -s ). --xargs . . {} . {} {} . --xargs --sshlogin . : -X (EXAMPLES) : man parallel_examples (SPREADING BLOCKS OF DATA) --round-robin --pipe-part --shard --bin --group-by --pipe . n --jobs . --recstart --recend . . (chunk) . (chunk) . --pipe (chunk) . stdin ( ) . . --pipe-part --pipe . . --block -1 size-of-file/n . n . --round-robin n . . (parse) . --shard n . . n . . --bin --shard . n n n . --group-by . --recend/--recstart . . . --pipe --pipe-part . --group-by --round-robin --pipe-part . (TIME POSTFIXES) s m h d 1 60 60*60 60*60*24 . : 100000 1d3.5h16.6m4s. (UNIT PREFIX) GNU parallel K M G T P k m g t p 1024 1048576 1073741824 1099511627776 1125899906842624 1000 1000000 1000000000 1000000000000 1000000000000000 . . 1000000 1M-12*2.024*2k . (QUOTING) GNU parallel . () : ( ) $ ` ' " < > ; | \ (context) : ~ & ! ? space * { # '\' . \' ' : perl -ne '/^\S+\s+\S+$/ and print $ARGV,"\n"' file : parallel perl -ne \''/^\S+\s+\S+$/ and print $ARGV,"\n"'\' ::: file $ / . $PARALLEL_SEQ . GNU parallel $ (sub shell) GNU parallel : seq 10 | parallel -N2 echo seq:\$PARALLEL_SEQ arg1:{1} arg2:{2} GNU parallel : VAR=this_is_set_before_starting echo test | parallel echo {} $VAR : test this_is_set_before_starting : VAR="two spaces between each word" echo test | parallel echo {} \'"$VAR"\' : test two spaces between each word GNU parallel GNU parallel : echo test | parallel VAR=this_is_set_after_starting \; echo {} \$VAR : test this_is_set_after_starting : echo test |\ parallel VAR='"two spaces between each word"' echo {} \'"$VAR"\' : test two spaces between each word $$ (process id) . GNU parallel : seq 10 | parallel echo $$ GNU parallel : seq 10 | parallel echo \$\$ GNU parallel : echo test | parallel echo {} \\\$VAR : test $VAR GNU parallel -q : echo test | parallel -q echo {} \$VAR : test $VAR . perl : perl -ne '/^\S+\s+\S+$/ and print $ARGV,"\n"' file : ls | parallel perl -ne '/^\\S+\\s+\\S+\$/\ and\ print\ \$ARGV,\"\\n\"' ls | parallel perl -ne \''/^\S+\s+\S+$/ and print $ARGV,"\n"'\' \' "' $' . GNU parallel -q : ls | parallel -q perl -ne '/^\S+\s+\S+$/ and print $ARGV,"\n"' . -q : ls *.gz | parallel -q "zcat {} >{.}" ls *.gz | parallel -q "zcat {} | bzip2 >{.}.bz2" > | . : 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 `'' sh: -c: line 1: syntax error: unexpected end of file zsh:1: no matches found: -q . bash <(cat foo) -q bash -c command : ls | parallel -q bash -c 'wc -c <(echo {})' : ls | parallel -q bash -c \ 'tar c {} | tee >(gzip >{}.tar.gz) | bzip2 >{}.tar.bz2' : ( export -f ) GNU parallel () . (LIST RUNNING JOBS) : killall -USR1 parallel GNU parallel (stderr) . (COMPLETE RUNNING JOBS BUT DO NOT START NEW JOBS) GNU parallel SIGHUP GNU parallel : killall -HUP parallel GNU parallel . (ENVIRONMENT VARIABLES) $PARALLEL_HOME GNU parallel . . : $HOME/.parallel. $PARALLEL_ARGHOSTGROUPS --hostgroups GNU parallel (hostgroups) . $ . --plus {agrp} . $PARALLEL_HOSTGROUPS --hostgroups GNU parallel ssh . $ . --plus {hgrp} . $PARALLEL_JOBSLOT GNU parallel GNU parallel . $ . --plus {slot} . $PARALLEL_JOBSLOT (jobslot) . {%} . {%} . $PARALLEL_PID GNU parallel GNU parallel . $ . GNU parallel . : kill -HUP $PARALLEL_PID GNU parallel . . $PARALLEL_RSYNC_OPTS rsync . : -rlDzR. $PARALLEL_SHELL GNU parallel: o $PARALLEL_SHELL : o GNU parallel : o $SHELL : o /bin/sh $PARALLEL_SSH GNU parallel ssh . $PARALLEL_SSH --ssh . (: --sshlogin). $PARALLEL_SSHHOST GNU parallel GNU parallel . $ . --plus {host} . $PARALLEL_SSHHOST (host) sshlogin . : 4//usr/bin/specialssh user@host : host $PARALLEL_SSHLOGIN GNU parallel GNU parallel . $ . --plus {sshlogin} . sshlogin (threads) . : 4//usr/bin/specialssh user@host : /usr/bin/specialssh user@host $PARALLEL_SEQ GNU parallel GNU parallel . $ . $PARALLEL_SEQ () . : seq 10 | parallel -N2 \ echo seq:'$'PARALLEL_SEQ arg1:{1} arg2:{2} {#} $PARALLEL_SEQ . $PARALLEL_TMUX tmux. tmux $PATH . $TMPDIR . : --tmpdir $PARALLEL_REMOTE_TMPDIR . : --tmpdir $PARALLEL $PARALLEL GNU parallel . ( $ * ) \ . : cat list | parallel -j1 -k -v ls cat list | parallel -j1 -k -v -S"myssh user@server" ls : cat list | PARALLEL="-kvj1" parallel ls cat list | PARALLEL='-kvj1 -S myssh\ user@server' \ parallel echo \ 'myssh' 'myssh' 'user@server' . : --profile ( ) (DEFAULT PROFILE (CONFIG FILE)) /etc/parallel/config ~/.parallel/config ( .parallelrc ) . '#' . $PARALLEL . $PARALLEL ~/.parallel/config /etc/parallel/config . $PARALLEL --tollef . (PROFILE FILES) --profile GNU parallel . --profiles . ~/.parallel . / . ./ . : sshlogin ~/.ssh/sshlogins sshlogin : echo --tag -S .. --nonall > ~/.parallel/nonall_profile parallel -J nonall_profile uptime : -j-1 nice: echo -j-1 nice > ~/.parallel/nice_profile parallel -J nice_profile bzip2 -9 ::: * : perl : echo "perl -e '\$a=\$\$; print \$a,\" \",'\$PARALLEL_SEQ',\" \";';" \ > ~/.parallel/pre_perl parallel -J pre_perl echo ::: * $ " \ () . : nice : echo -S .. nice > ~/.parallel/dist parallel -J dist --trc {.}.bz2 bzip2 -9 ::: * (EXIT STATUS) success=X success=Y% fail=Y% --halt-on-error . 0 . success=X : X . success=Y% : Y% . 1-100 . . Y% . 101 . 255 . -1 ( joblog SQL) Ctrl-C (timeout) . -2 ( joblog SQL) skip() {= =} . -1000 ( SQL) ( --sqlmaster). -1220 ( SQL) ( --sqlworker). fail=1 . GNU Parallel (DIFFERENCES BETWEEN GNU Parallel AND ALTERNATIVES) : man parallel_alternatives (BUGS) (Quoting of newline) (newline) : echo 1,2,3 | parallel -vkd, "echo 'a{}b'" : echo 1,2,3 | parallel -vkd, echo a{}b echo 1,2,3 | parallel -vkd, "echo 'a'{}'b'" echo 1,2,3 | parallel -vkd, "echo 'a'"{}"'b'" (Speed) GNU parallel - . . . -X . GNU parallel EXAMPLE: Speeding up fast jobs . SSH GNU parallel ssh ( MaxStartups SSHD). --sshloginfile . . . -M . (Disk access) (seek) . . ----- (read-all-compute-all-write-all) : sem --id diskio cat file | compute | sem --id diskio cat > file -- (read-compute-write) : sem --id read cat file | compute | sem --id write cat > file --- (read-compute-read-compute) CPU . --nice --nice . . -X -m . . (Aliases) : Can't exec "command": No such file or directory : open3: exec of by command failed : /bin/bash: command: command not found command command (alias) . export -f (export) env_parallel . env_parallel . MySQL --sql* MySQL . PostgreSQL . (REPORTING BUGS) https://savannah.gnu.org/bugs/?func=additem&group=parallel . . . : https://lists.gnu.org/archive/html/bug-parallel/2015-01/msg00000.html : o ( ). GNU parallel GNU parallel . o parallel --version. ( https://ftp.gnu.org/gnu/parallel) . o ( https://stackoverflow.com/help/mcve ). . . yes seq cat echo wc sleep . seq 100000000 > bigfile yes | head -n 1000000000 > file . : paste <(seq 1000) <(seq 1000 1999) localhost - . ( VirtualBox ) MCVE . . o . . o (https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1) (man parallel_tutorial) (man parallel_examples) . VirtualBox : https://sourceforge.net/projects/virtualboximage/files https://www.osboxes.org/virtualbox-images VirtualBox . VirtualBox VirtualBox . . . VirtualBox - VirtualBox - . : o parallel --version o + o o VirtualBox (AUTHOR) GNU parallel : O. Tange (2011): GNU Parallel - The Command-Line Power Tool, ;login: The USENIX Magazine, February 2011:42-47. . GNU Parallel . (C) 2007-10-18 (Ole Tange) http://ole.tange.dk (C) 2008-2010 (Ole Tange) http://ole.tange.dk (C) 2010-2026 (Ole Tange) http://ole.tange.dk (Free Software Foundation, Inc). xargs xargs GNU findutils 4.4.2 . (LICENSE) << >> (GNU GPL) ( ) . . << >> (GNU GPL) . . . (Documentation license I) / << >> (GNU FDL) . . LICENSES/GFDL-1.3-or-later.txt . (Documentation license II) : (to Share) (to Remix) : ( ). (Share Alike) . : . (Public Domain) . Other Rights : o o o . . LICENCES/CC-BY-SA-4.0.txt . (DEPENDENCIES) GNU parallel Perl Getopt::Long IPC::Open3 Symbol IO::File POSIX File::Temp . --csv Text::CSV . rsync ssh . (SEE ALSO) parallel_tutorial(1), env_parallel(1), parset(1), parsort(1), parallel_alternatives(1), parallel_design(7), niceload(1), sql(1), ssh(1), ssh-agent(1), sshpass(1), ssh-copy-id(1), rsync(1) 20260722 2026-07-25 PARALLEL(1)