基于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
相关文章
- PHP图片处理库Grafika详细教程(2):图像特效处理模块
- PHP图片处理库Grafika详细教程(1):图像基本处理
- 最全面的2015年全球程序员研究报告
- 如何在React中操作DOM元素?
- 一份前端开发人员的架构样式指南,请查收!
- 高性能Nginx HTTPS调优!为HTTPS提速30%
- GitHub发布年度报告:TypeScript成第四大语言
- 零售大数据分析应用的四个阶段
- 大幕已拉开,2018年人工智能的八个发展趋势看这里
- 如何在树莓派 4 上安装 Ubuntu 桌面系统
- 大数据治理需要具备哪些能力和关键技术?
- 如何轻松安装 Debian Linux 系统
- 2017年中国商业智能行业研究报告
- 从分布式管理到多租户实现,企业级大数据系统如何利用开源生态构建?
- 多彩贵州、爽爽贵阳——“数字经济引领新增长”开启2017年数博会大幕
- 一篇文章解决你所有关于数据分析的问题!
- 发展基础软件生态,建设自主创新根技术
- 干货|国内外十大主流采集软件盘点
- 浅谈车企如何点燃大数据
- 在 Linux 使用 systemd-udevd 管理你的接入硬件