我在去年整理了一个关于多行命令并行管理的脚本「submit.sh」,前些日子曾老师发来消息提供了更新的版本,今天我们一起来探讨一下。
有些日子了
之前的submit.sh主要是通过循环,将所有的命令分成多个批次,一个批次完成后才会运行下一个批次。
# submit.sh
# 把命令分为10份并行
for i in {0..9};do (nohup bash submit.sh script2.sh 10 $i 2>&1);done
今天要介绍的多行命令并行管理主要是基于xargs这个命令。
ls *fastq | xargs -iF -P 10 sh -c 'gzip F'
关于xargs的用法我曾在之前的推文有提过,不过没有深入太多。
本次主要用到它以下几个参数
关于sh命令的用法,可以查看我提供的参考资料[1],本文主要使用以下参数
以fastqc质控为例,本次测试数据为GSE145894中的三个数据SRR11178348、SRR11178349、SRR11178350,前面的步骤就不多做展示,直接从fastqc质控开始。
一共有6个文件,每次运行3个试试
ls *.gz | xargs -iF -P 3 sh -c 'fastqc -o ./ F'
可以看到只运行了三个命令
我们使用htop查看xargs的进程情况,发现其处在休眠状态(S),PID是28925。
kill掉该进程后,我们发现只有第一批次的三条命令运行完成,当这一批的命令结束以后,后面将不再运行下一批的命令。
使用xargs的好处是可以将该命令写入到代码中,适用于流程搭建的情况(如snakemake);而之前的submit.sh只能在脚本外面使用,实际上还会产生多个PID。在遇到特殊情况需要kill任务的情况,使用xargs就可以直接kill母命令的PID,而submit.sh只能一个个的kill或killall。
另外需要注意的是,xargs 只能传递单个变量(本文中为F),上述命令通过-iF来传递ls输出的内容;当需要输入多个文件的时候(如比对),似乎是没办法实现的。
[1]
sh命令: https://wangchujiang.com/linux-command/c/sh.html