zl程序教程

您现在的位置是:首页 >  其他

当前栏目

基于xargs命令的多行命令并行管理

2023-03-07 09:47:18 时间

我在去年整理了一个关于多行命令并行管理的脚本「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

关于xargs的用法我曾在之前的推文有提过,不过没有深入太多。

本次主要用到它以下几个参数

  • 「-i」, --replace[=R], replace R in INITIAL-ARGS with names read from standard input; if R is unspecified,assume {} : 将xargs传递的内容一行一行赋值给 {},「-iF」即将xargs的输出一行一行赋值给F。
  • 「-P」, --max-procs=MAX-PROCS run at most MAX-PROCS processes at a time : 最大进程数

sh

关于sh命令的用法,可以查看我提供的参考资料[1],本文主要使用以下参数

  • 「-c」, 从-c后的字符串中读取命令
  • 「-x」, 打印出所执行的命令以及当前状态

特殊符号

  • 「''」, 单引号,保持引号里的内容不变
  • 「“”」, 双引号,解析引号里的命令和变量
  • 「``」, 反引号,引号内部为命令,与$()等价

示例

以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