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

Bash脚本,它允许TORQUE中的qsub等待作业完成,非常类似于SGE系统中的-sync y,bash,qsub,torque,Bash,Qsub,Torque,我使用的是一个带有Torque/Maui系统的集群。我有一个bash脚本,它使用qsub命令提交一个作业,然后执行一些操作,比如移动文件、编写ASCII文件以及检查我提交的作业的输出。关于此输出,基本上,如果它包含数字1,则需要再次提交作业。如果与1不同,bash脚本将执行其他操作 问题是qsub在后台运行,所有bash都会立即进行评估。我想强迫qsub的行为非常像awk、cat、sort等等。。。当脚本在这些命令完成后继续执行时——如果不是放在后台的话 因此,我需要在第一个qsub处停止bas

我使用的是一个带有Torque/Maui系统的集群。我有一个bash脚本,它使用qsub命令提交一个作业,然后执行一些操作,比如移动文件、编写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),可能会发生多次

感谢您按照
qsub
文档所做的一切:

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


10月3日4:05提问:“这不是一个简单的工作依赖问题”

您必须创建一个简单的作业依赖性问题,不管怎样,这个问题对于您的脚本来说足够简单。事实上,您的脚本在
my_application\u 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\u output.txt
my_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

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
if qstat 12345.hpc.host &>/dev/null; then
    echo "Job is running"
else
    echo "Job is not running"
fi
作业完成后,qstat命令将不再显示该作业。那么,

$qstat 12345.hpc.host
qstat: Unknown Job Id Error 12345.hpc.host
事实上,输出甚至是不必要的。您可以将其丢弃到
/dev/null
,只需检查
qstat
命令的退出状态

$qstat 12345.hpc.host
Job ID                    Name             User            Time Use S Queue
------------------------- ---------------- --------------- -------- - -----
12345.hpc.host            STDIN            user            00:00:00 Q queue
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函数中,以便在所有处理脚本中使用。
您还可以扩展此想法,以启动并等待作业列表运行。

您是否能够获得需要等待的命令的PID?我尝试过,但不知道如何操作。当我使用ps时,它不会出现。嗨@John,我熟悉SGE,在那里我可以使用-sync y。但正如我在我的问题上所写的,我使用的是扭矩。。。。所以,我看起来类似于-sync y,但在扭矩方面。不管怎样,谢谢你的回答。好吧,根据这篇文档:你可以使用
-W dependent
来完成一项取决于另一个人完成的工作。也许你可以使用它?谢谢你的评论,我认为-W不适合我的问题,除非重新思考我的策略,因为通常无法预测我需要使用qsub的次数,-W的语法需要这个。。。再次感谢。嗨@TomRoche,非常感谢您的解决方案。。。事实上,我不得不改变我的脚本很多。我最终得到了一个与你所写的非常相似的解决方案。这里的要点是,据我所知,Torque/maui无法单独处理这个问题,需要通过shell来控制。