保留shell脚本命令的剩余部分,直到PBS qsub阵列作业完成

时间:2016-03-23 23:46:37

标签: shell wait chaining qsub

我是非常新的shell脚本,我正在尝试编写一个提交多个qsub作业的shell管道,但是有几个命令可以在这些qsub之间运行,取决于最近完成的工作。我一直在研究多种方法来尝试让shell脚本在提交qsub作业后继续进行,但没有一个成功。

我可以提供的最简单的代码块来说明问题如下:

THREADS=`wc -l < list1.txt`
qsub -V -t 1-$THREADS firstjob.sh
echo "firstjob.sh completed"

在此之后显然还有其他代码行实际上取决于firstjob.sh整理,但为了清楚起见,我在此省略了它们。我尝试了以下暂停/保存脚本的方法:

1)仅使用wait,它应该在所有后台程序完成之前停止脚本。在数组作业仍在运行时,这会向右推过wait并将echo语句打印到终端。我猜这是因为一旦提交了qsub作业,退出并且wait认为它已经完成了吗?

qsub -V -t 1-$THREADS firstjob.sh

wait

echo "firstjob.sh completed"

2)将作业设置为变量,回显该变量以提交作业,并使用整个作业ID和wait暂停。 echo命令应该等到阵列作业的所有元素都完成。代码块中的代码后面会显示错误消息。

job1=$(qsub -V -t 1-$THREADS firstjob.sh)
echo "$job1"

wait $job1

echo "firstjob.sh completed"

####ERROR RECEIVED#### 
-bash: wait: `4585057[].cluster-name.local': not a pid or valid job spec

3)使用-sync y qsub。这应该可以防止它在作业完成之前退出qsub,作为一个有效的暂停...我曾希望。命令后的注释出错。由于某种原因,它没有正确读取-sync选项?

qsub -V -sync y -t 1-$THREADS firstjob.sh

echo "firstjob.sh completed"

####ERROR RECEIVED####
qsub: script file 'y' cannot be loaded - No such file or directory

4)使用虚拟shell脚本(虚拟对象只生成一个空文件),以便我可以使用-W depend=afterok:的{​​{1}}选项暂停脚本。这再次推送到 echo 语句,没有任何暂停提​​交虚拟脚本。这两个工作都是一个接一个地提交,没有暂停。

qsub

关于脚本的一些进一步细节:

  • 每个作业提交都是一个数组作业。
  • 使用类似下面的命令在终端中运行管道,以便我可以为它提供3个输入:源Pipeline.sh -r list1.txt -d / workingDir / -s list2.txt
  • 我确定firstjob.sh实际上没有完成运行,因为我在使用job1=$(qsub -V -t 1-$THREADS demux.sh) echo "$job1" check=$(qsub -V -W depend=afterok:$job1 dummy.sh) echo "$check" echo "firstjob.sh completed" 时在队列中看到它们。

也许在大多数情况下都有一个简单的解决方法,但对于所有这些都是新手,我真的很挣扎。我必须在整个脚本中的8-10个位置使用此方法,因此它确实阻碍了进度。非常感谢任何帮助。感谢。

POST EDIT 1

这是firstjob.sh中包含的代码......虽然怀疑它会有所帮助。这里的所有东西都按预期运行,总能产生正确的结果。

showq

1 个答案:

答案 0 :(得分:0)

我刚尝试使用-sync y,这对我很有用,那里有个好主意......不确定你的设置有什么不同。

但您可以尝试的其他一些事情涉及您的主脚本,了解您正在运行的qsub个工作的状态。一个想法是,您可以让主脚本使用qstat检查作业的状态,并等到它完成后再继续。

或者,您可以将第一个作业写入文件作为其最后一步(或者,如您所建议的那样,设置一个等待第一个作业完成的虚拟作业)。然后在您的主脚本中,您可以在继续之前测试该文件是否已被写入。