您好,登錄后才能下訂單哦!
本篇內容介紹了“Linux并行作業執行工具GNU Parallel怎么用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
GNU Parallel是一個shell工具,為了在一臺或多臺計算機上并行的執行計算任務,一個計算任務可以是一條shell命令或者一個以每一行做為輸入的腳本程序。通常的輸入是文件列表、主機列表、用戶列表、URL列表或者表格列表;一個計算任務也可以是一個從管道讀取的一條命令。
Usage: parallel [options] [command [arguments]] command [arguments]] (::: arguments|:::: argfile(s))... cat ... | parallel --pipe [options] [command [arguments]] 常用選項: ::: 后面接參數 :::: 后面接文件 -j、--jobs 并行任務數 -N 每次輸入的參數數量 --xargs會在一行中輸入盡可能多的參數 -xapply 從每一個源獲取一個參數(或文件一行) --header 把每一行輸入中的第一個值做為參數名 -m 表示每個job不重復輸出“背景”(context) -X 與-m相反,會重復輸出“背景文本” -q 保護后面的命令 --trim lr 去除參數兩頭的空格,只能去除空格,換行符和tab都不能去除 --keep-order/-k 強制使輸出與參數保持順序 --keep-order/-k --tmpdir/ --results 都是保存文件,但是后者可以有結構的保存 --delay 延遲每個任務啟動時間 --halt 終止任務 --pipe 該參數使得我們可以將輸入(stdin)分為多塊(block) --block 參數可以指定每塊的大小
GNU Parallel的輸入源支持文件、命令行和標準輸入(stdin或pipe)。
# 命令行單輸入源[20:41 sxuan@hulab ~]$ parallel echo ::: a b c d e | tee a.txt a b c d e# stdin(標準輸入)作為輸入源[20:42 sxuan@hulab ~]$ cat a.txt | parallel echoa b c d e# GNU Parallel支持通過命令行指定多個輸入源,它會生成所有的組合。這在某些需要組合時非常好用[20:45 sxuan@hulab ~]$ parallel echo ::: A B C ::: D E F | tee b.txt A D A E A F B D B E B F C D C E C F# 多個文件作為輸入,此時多個文件中的內容也會像上面那樣進行組合[20:46 sxuan@hulab ~]$ parallel -a a.txt -a b.txt echo# stdin(標準輸入)作為文件源中的一個,使用 -, 輸出結果同上[20:52 sxuan@hulab ~]$ cat a.txt |parallel -a - -a b.txt echo# 可以使用::::代替-a,后面可接多個文件名[20:55 sxuan@hulab ~]$ cat a.txt | parallel echo :::: - b.txt# 最后,:::和::::可以同時使用,同樣的輸出結果也會進行組合[20:55 sxuan@hulab ~]$ parallel echo ::: a b :::: b.txt
當然,若不想像上面那樣進行組合,可使用--xapply
參數從每一個源獲取一個參數(或文件一行),這個參數有些類似R中的函數,具有廣播作用——如果其中一個輸入源的長度比較短,它的值會被重復。
[20:57 sxuan@hulab ~]$ parallel --xapply echo ::: A B C ::: D E F A D B E C F [21:04 sxuan@hulab ~]$ parallel --xapply echo ::: A B C ::: D E F G H I A D B E C F A G B H C I
GNU Parallel可以通過--arg-sep
和--arg-file-sep
指定分隔符替代 ::: 或 ::::,當這兩個符號被其它命令占用的時候會特別有用。
[21:18 sxuan@hulab ~]$ parallel -k --arg-sep ,,, echo ,,, a b ,,, c d | tee c.txt a c a d b c b d [21:22 sxuan@hulab ~]$ parallel --xapply --arg-file-sep ,,,, echo ,,,, a.txt b.txt a A D b A E c A F d B D e B E a B F b C D c C E d C F
GNU Parallel默認把一行做為一個參數:使用 \n 做為參數定界符。可以使用 -d 改變:
[21:25 sxuan@hulab ~]$ parallel -d b echo :::: a.txt a c d e
GNU Parallel支持通過-E
參數指定一個值做為結束標志:
[21:26 sxuan@hulab ~]$ parallel -E stop echo ::: A B stop C D A B
GNU Parallel使用 --no-run-if-empty
來跳過空行:
[21:28 sxuan@hulab ~]$ (echo 1; echo; echo 2) | parallel --no-run-if-empty echo1 2
如果parallel之后沒有給定命令,那么這些參數會被當做命令:
[21:29 sxuan@hulab ~]$ parallel ::: ls 'echo foo' pwda.txt b.txt c.txt jianchen mypipe scripts snake_test WGS_snake foo /home/sxuan
此外,命令還可以是一個腳本文件,一個二進制可執行文件或一個bash的函數(須用 export -f 導出函數)
[21:42 sxuan@hulab ~]$ echo "echo \$*" > s.sh [21:44 sxuan@hulab ~]$ parallel ./s.sh ::: "a b c f" "1 2 3 4"a b c f 1 2 3 4
GNU Parallel支持多種替換字符串,默認使用 {},使用 -I 改變替換字符串符號 {}。其最常見的字符串替換包括以下幾種:{.}
,去掉擴展名;{/}
,去掉路徑,只保留文件名;{//}
,只保留路徑;{/.}
,同時去掉路徑和擴展名;{#}
,輸出任務編號。同時對于每一個字符串替換都可以自己指定符號:-I
對應{}
;--extensionreplace
替換 {.}
;--basenamereplace
替換 {/}
;--dirnamereplace
替換{//}
;--basenameextensionreplace
替換 {/.}
;--seqreplace
替換 {#}
。
[22:02 sxuan@hulab ~]$ parallel echo ::: A/B.C ; parallel echo {} ::: A/B.C ; parallel -I ,, echo ,, ::: A/B.C A/B.C A/B.C A/B.C [22:04 sxuan@hulab ~]$ parallel echo {.} ::: A/B.C ; parallel --extensionreplace ,, echo ,, ::: A/B.C A/B A/B [22:08 sxuan@hulab ~]$ parallel echo {/} ::: A/B.C ; parallel --basenamereplace ,, echo ,, ::: A/B.C B.C B.C [22:08 sxuan@hulab ~]$ parallel echo {//} ::: A/B.C ; parallel --dirnamereplace ,, echo ,, ::: A/B.C A A [22:10 sxuan@hulab ~]$ parallel echo {/.} ::: A/B.C ; parallel --basenameextensionreplace ,, echo ,, ::: A/B.C B B [22:13 sxuan@hulab ~]$ parallel echo {#} ::: A B C ; parallel --seqreplace ,, echo ,, ::: A B C1 2 3 1 2 3
同時,如果有多個輸入源時,可以通過 {編號} 指定某一個輸入源的參數:
[22:14 sxuan@hulab ~]$ parallel --xapply echo {1} and {2} ::: A B ::: C D A and C B and D# 可以使用 / // /. 和 . 改變指定替換字符串[22:14 sxuan@hulab ~]$ parallel echo /={1/} //={1//} /.={1/.} .={1.} ::: A/B.C D/E.F /=B.C //=A /.=B .=A/B /=E.F //=D /.=E .=D/E# 位置可以是負數,表示倒著數[22:16 sxuan@hulab ~]$ parallel echo 1={1} 2={2} 3={3} -1={-1} -2={-2} -3={-3} ::: A B ::: C D ::: E F 1=A 2=C 3=E -1=E -2=C -3=A 1=A 2=C 3=F -1=F -2=C -3=A 1=A 2=D 3=E -1=E -2=D -3=A 1=A 2=D 3=F -1=F -2=D -3=A 1=B 2=C 3=E -1=E -2=C -3=B 1=B 2=C 3=F -1=F -2=C -3=B 1=B 2=D 3=E -1=E -2=D -3=B 1=B 2=D 3=F -1=F -2=D -3=B
使用 --header
把每一行輸入中的第一個值做為參數名。
[22:17 sxuan@hulab ~]$ parallel --xapply --header : echo f1={f1} f2={f2} ::: f1 A B ::: f2 C D | tee d.txt f1=A f2=C f1=B f2=D
使用 –colsep 把文件中的行切分為列,做為輸入參數。
[22:31 sxuan@hulab ~]$ perl -e 'printf "f1\tf2\nA\tB\nC\tD\n"' > tsv-file.tsv [22:32 sxuan@hulab ~]$ parallel --header : --colsep '\t' echo f1={f1} f2={f2} :::: tsv-file.tsv f1=A f2=B f1=C f2=D
--xargs
會在一行中輸入盡可能多的參數(與參數字符串長度有關),通過-s
可指定一行中參數的上限。
[09:44 sxuan@hulab ~]$ perl -e 'for(1..30000){print "$_\n"}' > num30000 [09:50 sxuan@hulab ~]$ cat num30000 | parallel --xargs echo | wc -l 3### 這里官網給出的例子是2行,我的計算機centos7上面的結果是3行,應該跟linux版本有關[09:50 sxuan@hulab ~]$ cat num30000 | parallel --xargs -s 10000 echo | wc -l 17
為了獲得更好的并發性,GNU Parallel會在文件讀取結束后再分發參數。 GNU Parallel 在讀取完最后一個參數之后,才開始第二個任務,此時會把所有的參數平均分配到4個任務(如果指定了4個任務)。 第一個任務與上面使用 --xargs
的例子一樣,但是第二個任務會被平均的分成4個任務,最終一共5個任務。(奇怪的是我的結果與官網教程的結果不一樣)
[11:44 sxuan@hulab ~]$ cat num30000 | parallel --jobs 4 -m echo | wc -l 6 ### 官網教程里這里是5# 10分參數分配到4個任務可以看得更清晰 (這里的結果與官網一致)[11:50 sxuan@hulab ~]$ parallel --jobs 4 -m echo ::: {1..10} 1 2 3 4 5 6 7 8 9 10
替換字符串可以是輸出字符的一部分,使用-m
參數表示每個job不重復輸出“背景”(context),-X
則與-m
相反,會重復輸出“背景文本”,具體通過下面幾個例子進行理解:
[11:36 sxuan@hulab ~]$ parallel --jobs 4 echo pre-{}-post ::: A B C D E F G pre-A-post pre-B-post pre-C-post pre-D-post pre-E-post pre-F-post pre-G-post [11:51 sxuan@hulab ~]$ parallel --jobs 4 -m echo pre-{}-post ::: A B C D E F G pre-A B-post pre-C D-post pre-E F-post pre-G-post [11:57 sxuan@hulab ~]$ parallel --jobs 4 -X echo pre-{}-post ::: A B C D E F G pre-A-post pre-B-post pre-C-post pre-D-post pre-E-post pre-F-post pre-G-post
使用 -N
限制每行參數的個數,其中-N0
表示一次只讀取一個參數,且不輸入這個參數(作為計數器來使用)。
[12:04 sxuan@hulab ~]$ parallel -N4 echo 1={1} 2={2} 3={3} ::: A B C D E F G H 1=A 2=B 3=C 1=E 2=F 3=G [12:05 sxuan@hulab ~]$ parallel -N0 echo foo ::: 1 2 3 foo foo foo
如果命令行中包含特殊字符,就需要使用引號保護起來。 perl腳本 ‘print “@ARGV\n”‘ 與linux的 echo 的功能一樣。
[12:05 sxuan@hulab ~]$ perl -e 'print "@ARGV\n"' A A
使用GNU Parallel運行這條命令的時候,perl命令需要用引號包起來,也可以使用-q
保護perl命令:
[12:08 sxuan@hulab ~]$ parallel perl -e 'print "@ARGV\n"' ::: This wont work [12:09 sxuan@hulab ~]$ parallel -q perl -e 'print "@ARGV\n"' ::: This works This works [12:10 sxuan@hulab ~]$ parallel perl -e \''print "@ARGV\n"'\' ::: This works, too This works, too
使用--trim
去除參數兩頭的空格:
[12:10 sxuan@hulab ~]$ parallel --trim r echo pre-{}-post ::: ' A 'pre- A-post [12:12 sxuan@hulab ~]$ parallel --trim l echo pre-{}-post ::: ' A 'pre-A -post [12:12 sxuan@hulab ~]$ parallel --trim lr echo pre-{}-post ::: ' A 'pre-A-post
使用--tag
以參數做為輸出前綴,使用--tagstring
修改輸出前綴:
[12:17 sxuan@hulab ~]$ parallel --tag echo foo-{} ::: A B C A foo-A B foo-B C foo-C [12:19 sxuan@hulab ~]$ parallel --tagstring {}-bar echo foo-{} ::: A B C A-bar foo-A B-bar foo-B C-bar foo-C
--dryrun
作用類似于echo:
[12:19 sxuan@hulab ~]$ parallel --dryrun echo {} ::: A B Cecho Aecho Becho C [12:20 sxuan@hulab ~]$ parallel echo {} ::: A B C A B C
--verbose
則在運行之前先打印命令:
[12:21 sxuan@hulab ~]$ parallel --verbose echo {} ::: A B Cecho Aecho Becho C A B C
一般來說,GNU Parallel 會延遲輸出,直到一組命令執行完成。使用--ungroup
,可立刻打印輸出已完成部分。
[13:45 sxuan@hulab ~]$ parallel -j2 'printf "%s-start\n%s" {} {};sleep {};printf "%s\n" -middle;echo {}-end' ::: 4 2 1 2-start 2-middle 2-end 1-start 1-middle 1-end 4-start 4-middle 4-end [13:45 sxuan@hulab ~]$ parallel -j2 --ungroup 'printf "%s-start\n%s" {} {};sleep {};printf "%s\n" -middle;echo {}-end' ::: 4 2 1 4-start 42-start 2-middle 2-end 1-start 1-middle 1-end -middle 4-end
使用 --ungroup
會很快,但會導致輸出錯亂,一個任務的行輸出可能會被另一個任務的輸出截斷。像上例所示,第二行輸出混合了兩個任務: ‘4-middle’ ‘2-start’。使用 --linebuffer
避免這個問題(稍慢一點):
4-start 2-start 2-middle 2-end 1-start 1-middle 1-end 4-middle 4-end
強制使輸出與參數保持順序 --keep-order/-k
:
[13:53 sxuan@hulab ~]$ parallel -j2 -k 'printf "%s-start\n%s" {} {};sleep {};printf "%s\n" -middle;echo {}-end' ::: 4 2 1 4-start 4-middle 4-end 2-start 2-middle 2-end 1-start 1-middle 1-end
GNU Parallel可以把每一個任務的輸出保存到文件中,臨時文件默認保存在 /tmp 中,可以使用 –tmpdir改變(或者修改 $TMPDIR):
[13:55 sxuan@hulab ~]$ parallel --files ::: A B C /tmp/parfmNTJ.par /tmp/parmioFz.par /tmp/pargaTxf.par [13:57 sxuan@hulab ~]$ parallel --tmpdir ~ --files ::: A B C /home/sxuan/parLEXH7.par /home/sxuan/parXsKsR.par /home/sxuan/parZxytI.par [13:58 sxuan@hulab ~]$ TMPDIR=~ parallel --files ::: A B C /home/sxuan/par2tX6C.par /home/sxuan/parorPJy.par /home/sxuan/pari5TkI.par
輸出文件可以有結構的保存 --results
,輸出文件不僅包含標準輸出(stdout)也會包含標準錯誤輸出(stderr):
[13:59 sxuan@hulab ~]$ parallel --results outdir echo ::: A B C A B C [14:00 sxuan@hulab ~]$ tree outdir/ outdir/ └── 1 ├── A │ ├── seq │ ├── stderr │ └── stdout ├── B │ ├── seq │ ├── stderr │ └── stdout └── C ├── seq ├── stderr └── stdout 4 directories, 9 files
在使用多個變量的時候會顯示很有用:
# --header : will take the first value as name and use that in the directory structure.[14:02 sxuan@hulab ~]$ parallel --header : --results outdir echo ::: f1 A B ::: f2 C D A C A D B C B D [14:02 sxuan@hulab ~]$ tree outdir/ outdir/ └── f1 ├── A │ └── f2 │ ├── C │ │ ├── seq │ │ ├── stderr │ │ └── stdout │ └── D │ ├── seq │ ├── stderr │ └── stdout └── B └── f2 ├── C │ ├── seq │ ├── stderr │ └── stdout └── D ├── seq ├── stderr └── stdout 9 directories, 12 files
使用 –jobs/-j 指定并行任務數。
# 使用64個任務執行128個休眠命令[15:02 sxuan@hulab ~]$ time parallel -N0 -j64 sleep 1 ::: {1..128} real 0m2.759s user 0m0.657s sys 0m1.345s# 默認情況下并行任務數與cpu核心數相同, 所以這條命令會比每個cpu兩個任務的耗時多一倍[15:03 sxuan@hulab ~]$ time parallel -N0 sleep 1 ::: {1..128} real 0m3.478s user 0m0.656s sys 0m1.344s# 每個cpu兩個任務[15:03 sxuan@hulab ~]$ time parallel -N0 --jobs 200% sleep 1 ::: {1..128} real 0m2.659s user 0m0.734s sys 0m1.423s# 使用 --jobs 0 表示執行盡可能多的并行任務[15:03 sxuan@hulab ~]$ time parallel -N0 --jobs 0 sleep 1 ::: {1..128} real 0m2.135s user 0m0.651s sys 0m1.477s# 除了基于cpu使用率之外,也可以基于cpu數[15:03 sxuan@hulab ~]$ time parallel --use-cpus-instead-of-cores -N0 sleep 1 ::: {1..128} real 1m5.499s user 0m0.950s sys 0m1.897s
通過使用 --interactive
在一個任務執行之前讓用戶決定是否執行。
[15:08 sxuan@hulab ~]$ parallel --interactive echo ::: 1 2 3echo 1 ?...yecho 2 ?...yecho 3 ?...y 1 2 3
當job有大量的IO操作時,為避免“驚群效應”,可使用--delay
參數指定各個job開始的時間間隔。
[15:16 sxuan@hulab ~]$ parallel --delay 2.5 echo Starting {}\;date ::: 1 2 3 Starting 1 Tue Apr 17 15:21:41 CST 2018 Starting 2 Tue Apr 17 15:21:44 CST 2018 Starting 3 Tue Apr 17 15:21:46 CST 2018
若已知任務超過一定時間未反應則為失敗則可以通過--timeout
指定等待時間避免無謂的等待。GNU parallel能計算所有任務運行時間的中位數,因此可以指定時間為中位數的倍數關系。
[15:35 sxuan@hulab ~]$ parallel --timeout 4.1 sleep {}\; echo {} ::: 2 4 6 8 2 4 [15:36 sxuan@hulab ~]$ parallel --timeout 200% sleep {}\; echo {} ::: 2.1 2.2 3 7 2.3 2.1 2.2 2.3 3
GNU parallel有多種方式可用來動態的顯示任務進度信息,如:
parallel --eta sleep ::: 1 3 2 2 1 3 3 2 1 parallel --progress sleep ::: 1 3 2 2 1 3 3 2 1 seq 1000 | parallel -j10 --bar '(echo -n {};sleep 0.1)' 2> >(zenity --progress --auto-kill --auto-close)
使用--joblog
參數能夠生成各個任務的日志文件:
[15:39 sxuan@hulab ~]$ parallel --joblog /tmp/log exit ::: 1 2 3 0 [15:41 sxuan@hulab ~]$ cat /tmp/logSeq Host Starttime JobRuntime Send Receive Exitval Signal Command 1 : 1523950890.344 0.018 0 0 1 0 exit 1 2 : 1523950890.350 0.014 0 0 2 0 exit 2 3 : 1523950890.357 0.006 0 0 3 0 exit 3 4 : 1523950890.363 0.006 0 0 0 0 exit 0
通過--resume-failed
參數可以重新運行失敗的任務; --retry-failed
的作用與--resume-failed
類似,只是--resume-failed
從命令行讀取失敗任務,而--retry-failed
則是從日志文件中讀取失敗任務:
[15:41 sxuan@hulab ~]$ parallel --resume-failed --joblog /tmp/log exit ::: 1 2 3 0 0 0 [15:48 sxuan@hulab ~]$ cat /tmp/logSeq Host Starttime JobRuntime Send Receive Exitval Signal Command 1 : 1523950890.344 0.018 0 0 1 0 exit 1 2 : 1523950890.350 0.014 0 0 2 0 exit 2 3 : 1523950890.357 0.006 0 0 3 0 exit 3 4 : 1523950890.363 0.006 0 0 0 0 exit 0 1 : 1523951289.575 0.029 0 0 1 0 exit 1 2 : 1523951289.580 0.025 0 0 2 0 exit 2 3 : 1523951289.585 0.019 0 0 3 0 exit 3 5 : 1523951289.591 0.013 0 0 0 0 exit 0 6 : 1523951289.604 0.004 0 0 0 0 exit 0 [15:48 sxuan@hulab ~]$ parallel --retry-failed --joblog /tmp/log[15:50 sxuan@hulab ~]$ cat /tmp/logSeq Host Starttime JobRuntime Send Receive Exitval Signal Command 1 : 1523950890.344 0.018 0 0 1 0 exit 1 2 : 1523950890.350 0.014 0 0 2 0 exit 2 3 : 1523950890.357 0.006 0 0 3 0 exit 3 4 : 1523950890.363 0.006 0 0 0 0 exit 0 1 : 1523951289.575 0.029 0 0 1 0 exit 1 2 : 1523951289.580 0.025 0 0 2 0 exit 2 3 : 1523951289.585 0.019 0 0 3 0 exit 3 5 : 1523951289.591 0.013 0 0 0 0 exit 0 6 : 1523951289.604 0.004 0 0 0 0 exit 0 1 : 1523951445.089 0.013 0 0 1 0 exit 1 2 : 1523951445.094 0.009 0 0 2 0 exit 2 3 : 1523951445.102 0.007 0 0 3 0 exit 3
GNU parallel支持在某一情況下(如第一個失敗或成功時,或者20%任務失敗時)終止任務,終止任務又有兩種類型,其一為立即終止(通過--halt now
指定),殺死所有正在運行的任務并停止生成新的任務,其二為稍后終止(通過--halt soon
指定),停止生成新任務并等待正在運行任務完成。
[15:50 sxuan@hulab ~]$ parallel -j2 --halt soon,fail=1 echo {}\; exit {} ::: 0 0 1 2 3 0 0 1 parallel: This job failed:echo 1; exit 1 parallel: Starting no more jobs. Waiting for 1 jobs to finish. 2 parallel: This job failed:echo 2; exit 2 [16:04 sxuan@hulab ~]$ parallel -j2 --halt now,fail=1 echo {}\; exit {} ::: 0 0 1 2 3 0 0 1 parallel: This job failed:echo 1; exit 1 [16:05 sxuan@hulab ~]$ parallel -j2 --halt soon,fail=20% echo {}\; exit {} ::: 0 1 2 3 4 5 6 7 8 9 0 1 parallel: This job failed:echo 1; exit 1 2 parallel: This job failed:echo 2; exit 2 parallel: Starting no more jobs. Waiting for 1 jobs to finish. 3 parallel: This job failed:echo 3; exit 3 [16:05 sxuan@hulab ~]$ parallel -j2 --halt now,success=1 echo {}\; exit {} ::: 1 2 3 0 4 5 6 1 2 3 0 parallel: This job succeeded:echo 0; exit 0
GNU parallel還支持在任務失敗后重試運行--retries
:
[16:06 sxuan@hulab ~]$ parallel -k --retries 3 'echo tried {} >>/tmp/runs; echo completed {}; exit {}' ::: 1 2 0 completed 1 completed 2 completed 0 [16:09 sxuan@hulab ~]$ cat /tmp/runs tried 1 tried 2 tried 0 tried 1 tried 2 tried 1 tried 2
關于終止信號的高級用法參考官方入門文檔。
GNU parallel能夠在開始一個新的任務前檢查系統的負載情況防止過載(通過--load
可指定負載),同時還能檢查系統是否使用了交換空間(swap)(通過--noswap
限制使用swap)。
[16:09 sxuan@hulab ~]$ parallel --load 100% echo load is less than {} job per cpu ::: 1 load is less than 1 job per cpu [16:19 sxuan@hulab ~]$ parallel --noswap echo the system is not swapping ::: now the system is not swapping now
同時,對于某些占用內存較多的程序,parallel會檢查內存只有內存滿足時才啟動任務(通過--memfree
指定需要內存大小),而且在啟動任務后內存不夠50%時會殺掉最新開始的任務,直到這個任務完成再重新開始那些殺死的任務。
[16:24 sxuan@hulab ~]$ parallel --memfree 1G echo will run if more than 1 GB is ::: free will run if more than 1 GB is free
還可以通過--nice
來指定任務的優先級。
[16:27 sxuan@hulab ~]$ parallel --nice 17 echo this is being run with nice -n ::: 17 this is being run with nice -n 17
可使用-S host
來進行遠程登陸: parallel -S username@$SERVER1 echo running on ::: username@$SERVER1
GNU parallel 文件傳輸使用的是rsync。
echo This is input_file > input_file parallel -S $SERVER1 --transferfile {} cat ::: input_file
更多遠程操作參見入門文檔。
--pipe
參數使得我們可以將輸入(stdin)分為多塊(block),然后分配給多個任務多個cpu以達到負載均衡,最后的結果順序與原始順序一致。使用--block
參數可以指定每塊的大小,默認為1M。
[17:15 sxuan@hulab ~]$ perl -e 'for(1..1000000){print "$_\n"}' > num1000000 [17:16 sxuan@hulab ~]$ cat num1000000 | parallel --pipe wc 165668 165668 1048571 149796 149796 1048572 149796 149796 1048572 149796 149796 1048572 149796 149796 1048572 149796 149796 1048572 85352 85352 597465
如果不關心結果順序,只想要快速的得到結果,可使用--round-robin
參數。沒有這個參數時每塊文件都會啟動一個命令,使用這個參數后會將這些文件塊分配給job數任務(通過--jobs
進行指定)。若想分配更為均勻還可同時指定--block
參數。
[17:17 sxuan@hulab ~]$ cat num1000000 | parallel --pipe -j4 --round-robin wc 299592 299592 2097144 315464 315464 2097143 149796 149796 1048572 235148 235148 1646037 [17:23 sxuan@hulab ~]$ cat num1000000 | parallel --pipe -j4 --block 2M --round-robin wc 299593 299593 2097151 315465 315465 2097150 299593 299593 2097151 85349 85349 597444
“Linux并行作業執行工具GNU Parallel怎么用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。