允许TORQUE中的qsub等待作业完成的Bash脚本,非常类似于SGE系统中的-sync y

时间:2014-10-03 04:05:14

标签: bash qsub torque

我正在使用带有Torque / Maui系统的群集。我有一个使用qsub命令提交一个作业的bash脚本,然后做了几件事,比如移动文件,写ASCII文件,并检查我提交的作业的输出。关于此输出,基本上,如果它包含数字1,则需要再次提交作业。如果不同于1,则bash脚本会执行其他操作。

问题是qsub在后台运行,并且所有bash都会立即进行评估。我想强迫qsub表现得非常像awk,cat,sort等......当脚本在这些命令完成后再进一步 - 如果没有放在后台。

所以,我需要在第一个qsub上停止bash,并在qsub完成后继续运行,这意味着,当作业完成时。有没有办法做到这一点?它将类似于:

   -sync y    # in the SGE system, for instance.

我有什么:

#!/bin/bash
.
.
some commands
.
.
qsub my_application  # need to wait until my_application get done
.
.
more commands
.
.
my_application_output=(`cat my_application_output.txt`)

case "$my_application_output" in
["1"])
     qsub my_application
     ;;
["0"])
     some commands
     ;;
["100"])
     some commands
     ;;
*)
     some commands
     exit 1

esac

.
.

一些评论


  • 使用时不方便:qsub -I -x,一旦我想将输出保留在输出文件上;并且不希望通过启动交互模式(-I)
  • 来锁定节点
  • 我想这不是一个简单的工作依赖问题,一旦重新提交1)可能发生,2)不能,而且,最重要的是,如果发生(1),它可能是几次。

全部谢谢

3 个答案:

答案 0 :(得分:2)

10月3日4点05分:"这不是一个简单的工作依赖问题"

您必须创建一个简单的作业依赖性问题 - 无论如何都足以让您的脚本处理。实际上,您的脚本会在my_application_output.txt上关闭,那么为什么不只是sleep呢?

之类的东西
#!/usr/bin/env bash
# I prefer to have constants at the top
my_application_output_fp='/path/to/my_application_output.txt' 
#
#
# some commands
#
#
qsub my_application
#
#
# more commands
#
#

# sleep until my_application outputs
while [[ ! -r "${my_application_output_fp}" ]] ; do
    sleep 1
done

my_application_output="$(cat ${my_application_output_fp})"
# process it

如果my_application_output.txtmy_application结尾之前写得太长,请更改my_application以在退出之前写入一个标记文件,然后选择该文件:

#!/usr/bin/env bash
my_application_flag_fp='/path/to/my_application_flag.txt' 
my_application_output_fp='/path/to/my_application_output.txt' 
#
#
# some commands
#
#
qsub my_application
#
#
# more commands
#
#

# sleep until my_application writes flag
while [[ ! -r "${my_application_flag_fp}" ]] ; do
    sleep 1
done

if [[ ! -r "${my_application_output_fp}" ]] ; then
    # handle error
fi
# else
my_application_output="$(cat ${my_application_output_fp})"
# process it

答案 1 :(得分:2)

qsub命令应返回要执行的作业的ID,类似于

$qsub myapplication  
12345.hpc.host

然后,您可以使用qstat命令

来检查作业的状态
$qstat 12345.hpc.host
Job ID                    Name             User            Time Use S Queue
------------------------- ---------------- --------------- -------- - -----
12345.hpc.host            STDIN            user            00:00:00 Q queue

作业完成后,qstat命令不再显示该作业。在那种情况下,

$qstat 12345.hpc.host
qstat: Unknown Job Id Error 12345.hpc.host

事实上,输出甚至没有必要。可以将其丢弃到/dev/null并简单地检查qstat命令的退出状态,

if qstat 12345.hpc.host &>/dev/null; then
    echo "Job is running"
else
    echo "Job is not running"
fi

甚至更短,

qstat 12345.hpc.host &> /dev/null && echo "Job is running" || echo "Job is NOT running"

所以你想要实现的目标应该是相当简单的。启动作业,将其id存储在变量中并休眠,直到qstat命令失败,

JOBID=$(qsub myapplication)
while qstat $JOBID &> /dev/null; do
    sleep 5;
done;

您可以将while循环存储在bash函数中,以用于所有处理脚本。 您还可以扩展此想法以启动并等待要运行的作业列表。

答案 2 :(得分:0)

根据qsub文档:

  

-sync y导致qsub等待作业完成             在退出之前。