等待的qsub工作组来完成(Wait for set of qsub jobs to complet

2019-06-26 08:02发布

我有开始了一对夫妇的qsub作业的批处理脚本,我想陷阱时,他们都完成了。

我不想使用-sync选项,因为我希望他们能够同时运行。 每个职业都有一套不同的命令行参数。

我想我的脚本等待时,所有的工作已经完成为止,并做之后的东西。 我不想使用睡眠功能如检查是否某些文件已分别30秒后产生的,因为这是对资源流失。

我相信,扭矩可以有一些选择,但我运行SGE。

我如何能实现这个请任何想法?

感谢诗我发现另一个线程链接

其中有一个效应初探

您可以使用等待停止执行,直到所有的作业都完成。 你甚至可以收集所有的退出状态和其他运行统计数据(时间花了,当时做的工作数量,等等),如果你周围循环等待特定的ID。

但我不知道如何使用它没有投票的一些价值。 可以打坏使用陷阱,但我将如何通过q​​sub?

Answer 1:

启动您的qsub工作,使用-N选项给他们任意名称(JOB1,JOB2等):

qsub -N job1 -cwd ./job1_script
qsub -N job2 -cwd ./job2_script
qsub -N job3 -cwd ./job3_script

启动你的脚本,并告诉它要等到就业名为JOB1,它开始前作业2和作业3完成:

qsub -hold_jid job1,job2,job3 -cwd ./results_script


Answer 2:

qsub -hold_jid job1,job2,job3 -cwd ./myscript


Answer 3:

(从另一替代这里 )如下:

FIRST=$(qsub job1.pbs)
echo $FIRST
SECOND=$(qsub -W depend=afterany:$FIRST job2.pbs)
echo $SECOND
THIRD=$(qsub -W depend=afterany:$SECOND job3.pbs)
echo $THIRD

的见解是,使用qsub返回作业ID并且这通常转储到标准输出。 相反,捕捉它的变量( $FIRST$SECOND$THIRD ),并使用-W depend=afterany:[JOBIDs]当你排队的作业控制时,他们离队的依赖性结构标志。



Answer 4:

这工作在bash,但思路应该是便携。 使用-terse便于建立与作业ID来等待一个字符串; 然后提交使用一个虚拟工作-hold_jid等待在以前的工作和-sync y使的qsub不会返回,直到它(以及所有prereqs)已完成:

# example where each of three jobs just sleeps for some time:
job_ids=$(qsub -terse -b y sleep 10)
job_ids=job_ids,$(qsub -terse -b y sleep 20)
job_ids=job_ids,$(qsub -terse -b y sleep 30)
qsub -hold_jid ${job_ids} -sync y -b y echo "DONE"  
  • -terse选项使的qsub的输出仅仅是作业ID
  • -hold_jid选项(在其他的答案中提到)工作会等待指定的作业ID
  • -sync y选项(由OP引用)要求的qsub不返回,直到提交作业完成
  • -by指定该命令是不是一个脚本文件的路径(例如,我使用的sleep 30的命令)

请参阅手册页了解更多详情。



Answer 5:

如果所有的工作都在名称中常见的模式,您可以在提交作业提供了模式。 https://linux.die.net/man/1/sge_types显示您可以用什么模式。 例:

-hold_jid "job_name_pattern*"


Answer 6:

如果你有你想要的过程,并能只有15运行每次150个文件,而其他都是拿着你可以设置像这样的队列。

# split my list files in a junk of small list having 10 file each
awk 'NR%10==1 {x="F"++i;}{ print >  "list_part"x".txt" }'  list.txt

的qsub以这样的方式,每个list_part的* .TXT举办第二届一个第一....第二个举办第三个.....等所有作业。

for list in $( ls list_part*.txt ) ; do
    PREV_JOB=$(qsub start.sh) # create a dummy script start.sh just for starting
 for file in  $(cat $list )  ; do
   NEXT_JOB=$(qsub -v file=$file  -W depend=afterany:$PREV_JOB  myscript.sh )
   PREV_JOB=$NEXT_JOB
 done
done

如果您在myscript.sh需要移动或下载多个文件或群集兰创建交通繁忙的程序有这非常有用



Answer 7:

我需要更多的灵活性,所以我建这个和其他目的的Python模块这里 。 您可以直接运行的模块作为脚本( python qsub.py用于演示)。

用法:

$ git clone https://github.com/stevekm/util.git
$ cd util
$ python
Python 2.7.3 (default, Mar 29 2013, 16:50:34)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import qsub
>>> job = qsub.submit(command = 'echo foo; sleep 60', print_verbose = True)
qsub command is:

qsub -j y -N "python" -o :"/home/util/" -e :"/home/util/" <<E0F
set -x
echo foo; sleep 60
set +x
E0F

>>> qsub.monitor_jobs(jobs = [job], print_verbose = True)
Monitoring jobs for completion. Number of jobs in queue: 1
Number of jobs in queue: 0
No jobs remaining in the job queue
([Job(id = 4112505, name = python, log_dir = None)], [])

因为我们的系统上运行什么这就是与Python 2.7和SGE设计。 所需要的唯一的非标准Python库是包括tools.pylog.py模块和sh.py (也包括)

显然不是,如果你想留在纯粹作为有用的bash ,但如果你需要等待qsub工作,那么我会想象你的工作流程正逐渐走向会从使用Python,而不是受益的复杂性。



文章来源: Wait for set of qsub jobs to complete
标签: qsub