我有一个Perl脚本,它向SGE提交了一堆数组作业。我希望所有作业并行运行以节省时间,并让脚本等待它们全部完成,然后继续下一个处理步骤,该步骤集成来自所有SGE输出文件的信息并生成最终输出。
为了将所有作业发送到后台然后等待,我使用了Parallel::ForkManager和一个循环:
$fork_manager = new Parallel::ForkManager(@as);
# @as: Max nb of processes to run simultaneously
for $a (@as) {
$fork_manager->start and next; # St
我使用qsub通过集群提交作业的方式如下:
Submitting jobs from standard input
To submit a PBS job by typing job specifications at the command line, the user types
qsub [options] <return>
then types any directives, then any tasks, followed by
(in UNIX) CTRL-D on a
我正在使用一个带有Torque/Maui系统的集群。我有一个bash脚本,它使用qsub命令提交一个作业,然后做几件事情,比如移动文件、编写ASCII文件以及检查我提交的作业的输出。对于这个输出,基本上,如果它包含数字1,则需要再次提交作业。如果与1不同,bash脚本会执行其他操作。
问题是qsub在后台运行,所有bash都是一次评估的。我想强迫qsub的行为很像awk,cat,排序等等.当脚本在这些命令完成后更进一步时--如果不是放在后台的话。
所以,我需要bash在第一个qsub停止,然后在qsub完成后继续运行,这意味着,当作业完成时。有办法这样做吗?它将类似于:
-sync y
我有一个在集群的单个核心上运行的脚本。每个串行作业都是独立的。我用来运行的集群在每次您执行qsub时都会分配一个内核,因此它假定为ppn=1,然后其他所有人都可以使用其他内核。我只需通过循环qsub提交我想要运行的串行作业的数量。
然而,我们使用的另一个集群会自动为每个用户分配一个节点(他们已经将其设置为节点是最小的单元,而不是核心)。每个节点有16个核心。如果我随后提交我的脚本,它被分配了所有16个核心,但它只运行一个作业。因此,我想知道如何运行脚本并使其使用所有16个内核?
我想到的一个想法是使用另一个脚本运行并发作业,该脚本循环我当前的脚本,如下所示:
for I in {1..16}
目前,我正在使用qsub在集群上运行作业,并对这些作业设置了10小时的墙时间。有时工作超过这一时间,因此被终止,有时由于其他原因而终止工作。无论哪种方式,我都希望在qsub日志文件的底部有一个脚注,它将指示作业何时终止(可选地使用状态代码指示它是成功完成还是被中断)和总壁时间。放置类似于:
date
command here
date
在qsub文件中,由于最后一个date将不会被执行,如果作业持续了一段时间,它就无法工作。有谁知道怎么绕过这件事吗?
我知道我之前也从这个链接上问过同样的问题:
就像我在那个线程中说的,我以前在SLURM系统上做过这样的工作,没有任何问题,因为所有的东西都封装在一个提交脚本中。然而,从上述链接中的前一个问题来看,下面是我在SGE上的方法(我知道这是一个糟糕的实践,但我真的想不出更好的方法.)
作业通过4+N脚本链接:run.sh、submitSerial.sh、wrap.sh、temp.sh和job{1-N}.sh。
run.sh:主要作业脚本
#!/bin/bash
...some stuffs...
...create N directories to run N input files in