我用的是带扭矩/最大转矩系统的集群。我有一个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.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