首页 文章

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

提问于
浏览
5

我正在使用带有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

    Quim Oct 3 at 4:05: "it is not a simple job dependency problem"

    你必须 create 一个简单的工作依赖问题 - 无论如何都足够简单,你的脚本可以处理 . 事实上你的脚本在 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
    
  • 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

    根据 qsub docs:

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

相关问题