我用的是带扭矩/最大转矩系统的集群。我有一个bash脚本,它使用qsub命令提交一个作业,然后执行一些操作,比如移动文件、编写ASCII文件和检查我提交的作业的输出。关于此输出,基本上,如果它包含数字1,则需要再次提交作业。如果与1不同,bash脚本将执行其他操作。
问题是qsub是在后台运行的,所有bash都是一次计算的。我想强迫qsub表现得像awk,cat,sort等等。。。当脚本在这些命令完成后继续运行时-如果不是放在后台。
所以,我需要bash在第一个qsub处停止,并在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),可能会多次。
谢谢大家

最佳答案

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

07-27 13:22