我有一个 shell 脚本,它将多个任务排入队列以在 HPC 集群上执行。相同的作业提交脚本适用于带有一些次要条件逻辑的扭矩或网格引擎。这是一个管道,早期任务的输出被馈送到后面的任务以进行进一步处理。我正在使用 qsub 来定义作业依赖项,因此后面的任务会等待较早的任务完成后再开始执行。到目前为止,一切都很好。
有时,任务失败。当失败发生时,我不希望任何依赖任务尝试处理失败任务的输出。但是,在故障发生之前很久,相关任务就已经排队等待执行。什么是防止不需要的处理的好方法?
我有一个 shell 脚本,它将多个任务排入队列以在 HPC 集群上执行。相同的作业提交脚本适用于带有一些次要条件逻辑的扭矩或网格引擎。这是一个管道,早期任务的输出被馈送到后面的任务以进行进一步处理。我正在使用 qsub 来定义作业依赖项,因此后面的任务会等待较早的任务完成后再开始执行。到目前为止,一切都很好。
有时,任务失败。当失败发生时,我不希望任何依赖任务尝试处理失败任务的输出。但是,在故障发生之前很久,相关任务就已经排队等待执行。什么是防止不需要的处理的好方法?
您可以使用afterok
依赖项参数。例如,qsub 命令可能如下所示:
qsub -w depend=afterok:<jobid> submit.pbs
只有当 jobid 无错误退出时,Torque 才会开始下一个作业。请参阅自适应计算页面上的文档。
这是我最终实现的。完成这项工作的关键是在错误时返回错误代码 100。Sun Grid Engine 在看到错误代码 100 时停止执行后续作业。 Torque 在看到任何非零错误代码时停止执行后续作业。
qsub 启动一系列 bash 脚本。这些 bash 脚本中的每一个都有以下代码:
handleTrappedErrors()
{
errorCode=$?
bashCommand="$BASH_COMMAND"
scriptName=$(basename $0)
lineNumber=${BASH_LINENO[0]}
# log an error message to a log file here -- not shown
exit 100
}
trap handleErrors ERR
扭矩(如 Derek 所述):
qsub -W depend=afterok:<jobid> ...
太阳网格引擎:
qsub -hold_jid <jobid> ...