按顺序而不是使用bash连续运行作业

时间:2019-08-09 19:55:07

标签: bash loops queue

所以我在超级计算机上使用高斯09(计算化学软件)做了很多工作。

要提交工作,请使用以下命令行

 g09sub input.com -n 2 -m 4gb -t 200:00:00

其中n是使用的处理器数量,m是请求的内存,t是请求的时间。

我想知道是否有一种编写脚本的方法,该脚本将提交文件夹中的前10个.com文件,然后在完成后再提交另一个.com文件。

我有一个脚本可以一次提交一个文件夹中的所有.com文件,但是我可以限制在使用的超级计算机上可以排队的作业数量。

当前脚本如下

 #!/bin/bash 
 #SBATCH --partition=shared
 for i in *.com
        do g09sub $i -n 2 -m 4gb -t 200:00:00
 done

因此1.com,2.com,3.com等将同时提交。

我想要的是全部拥有1.com,2.com,3.com,4.com,5.com,6.com,7.com,8.com,9.com和10.com同时开始,然后每个完成都有另一个.com文件开始。因此,任何一个文件夹中最多只能同时运行10个作业。

如果有用,则每个作业在完成后都会创建一个.log文件。

尽管我不确定它是否重要,但超级计算机使用PBS排队系统。

2 个答案:

答案 0 :(得分:2)

尝试xargs或GNU parallel

xargs

ls *.com | xargs -I {} g09sub -P 10 {} -n 2 -m 4gb -t 200:00:00

说明:

  • -I {}告诉{}代表输入文件名
  • -P 10一次设置最多职位

parallel

ls *.com | parallel -P 10 g09sub {} -n 2 -m 4gb -t 200:00:00 # GNU parallel supports -P too
ls *.com | parallel --jobs 10 g09sub {} -n 2 -m 4gb -t 200:00:00

说明:

  • {}代表输入文件名
  • --jobs 10一次设置最多职位

答案 1 :(得分:1)

不确定超级计算机的可用性,但是GNU bash手册底部的3.2.6 GNU Parallel下提供了一个parallel示例。

  

Bash中没有内置并行运行命令的方法。 GNU Parallel是用于执行此操作的工具。

...

  

最后,可以使用Parallel并行运行一系列Shell命令,类似于“ cat文件| bash’。获取文件名列表,创建一系列shell命令以对其进行操作并将命令列表馈送到shell并不少见。并行可以加快速度。假设该文件包含一个外壳命令列表,每行一个,

parallel -j 10 < file

  

将使用shell评估命令(因为没有显式命令   (作为参数提供),以每次10个shell作业的块的形式提供。


在我无法使用该选项的情况下,使用jobs函数的效果很差。例如:

for entry in *.com; do
   while [ $(jobs | wc -l) -gt 9 ]; do
     sleep 1    # this is in seconds; your sleep may support 'arbitrary floating point number'
   done
   g09sub ${entry} -n 2 -m 4gb -t 200:00:00 & 
done

$(jobs | wc -l)计算${cmd} &

在后台产生的作业数
相关问题