参考资料:
http://serverfault.com/questions/374131/how-to-run-multiple-shell-scripts-in-parallel
一、安装
1. Debian 或 Ubuntu Linux 安装
sudo apt install parallel
2. RHEL/CentOS Linux 安装
sudo yum install parallel
3. Fedora Linux 安装
sudo dnf install parallel
4. 使用conda安装(推荐),这种方法在macos上面也可以使用
conda install -c conda-forge parallel
或
conda install -c conda-forge/label/cf201901 parallel
parallel --help
直接安装
wget -c https://ftp.gnu.org/gnu/parallel/parallel-latest.tar.bz2
tar -jxvf parallel-latest.tar.bz2
cd parallel-20190622
cat README
mkdir $HOME/parallel
./configure --prefix=$HOME/parallel&& make && make install
# $HOME/parallel/自定义安装路径
$HOME/parallel/bin/parallel --help
vim ~/.bashrc
export PATH=/home/qmcui/parallel/bin:$PATH
. ~/.bashrc
参数解释
Usage:
parallel [options] [command [arguments]] < list_of_arguments
parallel [options] [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 参数可以指定每块的大小
二、使用
1. :::
传递参数
$ parallel echo ::: a b | tee a.txt
a
b
$ parallel echo ::: A B ::: C D| tee b.txt
A C
A D
B C
B D
$ parallel -a a.txt -a b.txt echo
a A C
a A D
a B C
a B D
b A C
b A D
b B C
b B D
同:
cat a.txt |parallel -a - -a b.txt echo
-标准输入符,缓存占位符
# 同:
cat a.txt | parallel echo :::: - b.txt
# 同:
parallel echo ::: a b c d e :::: b.txt
parallel --xapply echo ::: A B ::: C D
A C
B D
parallel --xapply echo {1} {2} ::: A B ::: C D
A C
B D
parallel --xapply echo {2} {1} ::: A B ::: C D
C A
D B
GNU Parallel使用 --no-run-if-empty 来跳过空行:
$ (echo 1; echo; echo 2) | parallel --no-run-if-empty echo
1
2
$ (echo 1; echo; echo 2) | parallel echo
1
2
2. ::::
将参数/命令储存到文件里,然后以文件名传递参数/命令
#传参数
cat > parameter.txt
A
B
C
parallel echo :::: parameter.txt
A
B
C
parallel --dryrun echo :::: parameter.txt
echo A
echo B
echo C
#传命令
for i in A B C
do
echo echo ${i} >> command.txt
done
cat command.txt
echo A
echo B
echo C
parallel --dryrun :::: command.txt
echo A
echo B
echo C
parallel :::: command.txt
A
B
C
3. 关于大括号的使用
- 如上当传递多个参数时,使用{数字}形式可以灵活指定参数的位置
- 当参数为文件名(带路径)时,大括号的特殊用法可以实现巧妙组合
#组成字符串
parallel echo chr{}.fa ::: {1..5} X Y
chr1.fa
chr2.fa
chr3.fa
chr4.fa
chr5.fa
chrX.fa
chrY.fa
parallel echo cp {} {.}.test ::: ./*.txt
# cp ./a.txt ./a.test
# cp ./b.txt ./b.test
#如果只有一个参数,使用大括号即可指代该参数。如下,与上面命令等价
parallel echo cp {1} {1.}.test ::: ./*.txt
- 大括号的妙用
{} – full name 全名
{.} – one less file extension 以(最后一个)逗号为分隔符的前半部分
{/} – remove directory path 去除路径
{//} – directory path 仅保留路径
{/..} – remove directory path and two levels of file extension
echo dir1/dir2/file.txt.gz | parallel --plus 'echo -e {}\\n{.}\\n{/}\\n{//}\\n{/..}'
# dir1/dir2/file.txt.gz
# dir1/dir2/file.txt
# file.txt.gz
# dir1/dir2
# file
三、其他
示例 1
需求分析:假设我们有三个进程A和B和C,分别对应三个运行脚本a.sh,b.sh,c.sh。 A和B两个进程是完全独立的。C进行必须等待A进程和B进程都运行结束之后,才能启动C进程。
串联【不理想】:
a.sh;
b.sh;
c.sh;
如果这三个进程都要运行特别长的时间,如果10个小时左右。运行总时间就需要30个小时。
解决方法:因为我们知道A和B是相互独立的所以我们应该将A和B并联起来,然后再和C串联。这样运行时间就优化成了20个小时。
并联的话我们不能使用后台运行的方式,如果将A或者B后台运行了,C需要等待A和B都运行结束了才启动,但是C不知道A和B什么时候结束。
parallel -j 2 "sh a.sh" "sh b.sh";
sh c.sh
这样A和B就通过parallel来进行并联,等到A和B都运行结束了,parallel这个命令也就运行结束。然后再进行C程序。(满足我们的要求)
参考链接:
https://blog.csdn.net/wuyanyi/article/details/14647641
https://www.jianshu.com/p/e8cb9f0fc173
https://www.jianshu.com/p/936d0bc52ad5
网友评论