41

我有一个批处理脚本,它启动了几个 qsub 作业,我想在它们全部完成时进行陷阱。

我不想使用 -sync 选项,因为我希望它们同时运行。每个作业都有一组不同的命令行参数。

我希望我的脚本等到所有工作都完成后,然后再做一些事情。我不想使用睡眠功能,例如检查是否在每 30 秒后生成了某些文件,因为这会消耗资源。

我相信 Torque 可能有一些选择,但我正在运行 SGE。

请对我如何实现这一点有任何想法?

谢谢 Ps 我确实找到了另一个线程 链接

有回应

您可以使用 wait 停止执行,直到完成所有作业。如果您循环等待特定的 id,您甚至可以收集所有退出状态和其他运行统计信息(花费的时间、当时完成的作业数等)。

但我不确定如何在不轮询某些值的情况下使用它。可以使用 bash 陷阱,但我将如何使用 qsub?

4

9 回答 9

38

启动您的 qsub 作业,使用 -N 选项为它们指定任意名称(job1、job2 等):

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

启动您的脚本并告诉它等到名为 job1、job2 和 job3 的作业完成后再启动:

qsub -hold_jid job1,job2,job3 -cwd ./results_script
于 2013-05-31T15:47:23.393 回答
6

如果所有作业的名称都有一个共同的模式,您可以在提交作业时提供该模式。https://linux.die.net/man/1/sge_types向您展示了可以使用的模式。例子:

-hold_jid "job_name_pattern*"
于 2017-12-13T19:40:59.913 回答
4

另一种选择(从这里)如下:

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 返回 jobid,这通常被转储到标准输出。相反,将其捕获在变量 ( $FIRST, $SECOND, $THIRD) 中,并在将作业入队时使用该-W depend=afterany:[JOBIDs]标志来控制出队时的依赖结构。

于 2015-12-10T18:22:12.450 回答
3
qsub -hold_jid job1,job2,job3 -cwd ./myscript
于 2012-09-03T20:27:32.540 回答
3

这在 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 在提交的作业完成之前不要返回
  • -b y指定命令不是脚本文件的路径(例如,我sleep 30用作命令)

有关更多详细信息,请参见手册页

于 2017-09-26T21:07:01.407 回答
2
#!/depot/Python-2.4.2/bin/python

import os
import subprocess
import shlex

def trackJobs(jobs, waittime=4):
    while len(jobs) != 0:
        for jobid in jobs:
            x = subprocess.Popen(['qstat', '-j', jobid], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            std_out, std_err = x.communicate()
            if std_err :
                jobs.remove(jobid)
                break
        os.system("sleep " + str(waittime))
    return

这是一个简单的代码,您可以在其中跟踪 qsub 作业的完成状态。这里函数接受 jobIds 列表(例如 ['84210770', '84210774', '84210776', '84210777', '84210778'] )

于 2020-04-03T15:30:16.970 回答
1

如果您有 150 个要处理的文件并且每次只能运行 15 个,而另一个在队列中,您可以设置类似的内容。

# 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 中有一个需要移动或下载许多文件或在 cluster-lan 中创建大量流量的过程,这将非常有用

于 2016-03-17T13:46:26.383 回答
1

您可以启动一个作业数组qsub -N jobname -t 1-"$numofjobs" -tc 20,然后它只有一个作业 ID,一次运行 20 个。你给它一个名字,然后一直保持直到使用qsub -hold_jid jidor完成该数组qsub -hold_jid jobname

于 2020-06-05T09:02:23.637 回答
0

我需要更大的灵活性,所以我在这里为此和其他目的构建了一个 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。

于 2017-11-16T20:54:08.753 回答