我正在使用带有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
.
.
一些评论
全部谢谢
答案 0 :(得分:2)
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
答案 1 :(得分: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 :(得分:0)
根据qsub
文档:
-sync y导致qsub等待作业完成 在退出之前。