我正在使用带有 Torque/Maui 系统的集群。我有一个 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),它可以多次提交。
谢谢大家
最佳答案
Quim 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
关于允许 TORQUE 中的 qsub 等待作业完成的 Bash 脚本,非常类似于 SGE 系统中的 -sync y,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26173141/