如何在shell脚本中控制任务投递

如果只有一个样本,或者样本量不大的情况下,我会选择一次性投递所有的任务。但是如果有100个以上的样本,那我就得谨慎考虑。

snakemake 很好解决这个问题,它会按照你给定的任务数和CPU数,确定每次投递多少任务。但是,有些时候任务比较简单,比如说gzip压缩,我就不想写一个snakemake脚本,就想用shell完成。

解决这个问题的关键命令是wait, 它的作用是等待当前的任务完成,和条件语句进行搭配的话,就能够实现每次只运行一定量的任务。举个例子, 我想用gzip对这些文件进行压缩

许多fastq文件

直接用下面的命令,可能会影响到其他用户

ls *.fastq | while read fastq ; do echo "gzip $fastq &"; done

这里没有实际运行,只是用echo来示意。

而比较合适的做法是下面这种

#!/bin/bash

count=0

ls *.fastq | while read fastq 
do
    gzip $fastq &
    count=$((count+1))
    if [ $((count % 4 )) -eq 0 ];
    then
        wait
        count=0
    fi
done

每次循环时,会把任务会放入后台,之后检查当前的计数是不是4的倍数。如果是的话,等任务完成,在运行后续的任务,不是的后直接运行下一个任务。

这个小技巧要感谢 李广伟师兄。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.Linux下如何用命令查看实时日志(完整命令) tail -f 路径.log查看前多少行 tai-200f 路...
    qianyewhy阅读 2,362评论 0 11
  • WinRAR - 最新版本的更新 版本 5.50 1. WinRAR 和命令行 RAR 默认使用 RAR ...
    王舒璇阅读 2,431评论 0 2
  • Linux习惯问题: 在vim编辑时,按了ctrl + s后,再按ctrl + q就可以继续执行了。ctrl + ...
    光着脚的鞋阅读 4,559评论 0 16
  • 延时执行 到目前为止,我们所运行的命令都是立即执行的。也就是我们按下回车键的那一刻,命令就开始执行了。 其实,在L...
    Zoulf阅读 1,629评论 0 1
  • 传送门-->索引 一.配置Greendao 二.编写一个简单的bean类 注意一定要加@Entity,不然的话ma...
    Jowney阅读 659评论 0 0