qsub -hold_jid -afterok 循环未启动

qsub -hold_jid -afterok 循环未启动

我正在尝试通过提供以下.sh 脚本来依次运行提交给集群的一系列作业:

注释循环.sh:

#!/bin/bash

job=`qsub run_IntersectBed_1.sh 0`
for i in {1..3}
do
    job_next=`qsub -hold_jid $job run_IntersectBed_1.sh $i`
    job=$job_next
done

第一个作业(进入循环之前)被执行,但是下一个作业从未启动。

我认为该脚本写得很好。我将模式更改为可执行文件并运行它

nohup ./Annotation_Loop.sh(我认为这是必要的?)......但其余的事情永远都没有完成。

我之前尝试过 -W,用来-W depend=afterok:$job代替-hold_jid $job

#!/bin/bash

    job=`qsub run_IntersectBed_1.sh 0`
    for i in {1..3}
    do
        job_next=`qsub -W depend=afterok:$job run_IntersectBed_1.sh $i`
        job=$job_next
    done

但它又回来了unknown option -W

可能出了什么问题?:(

答案1

qsub 的输出在消息文本中包含了 jobid。在我的例子中:

$ qsub hello.sh
Your job 8845476 ("hello.sh") has been submitted

您应该从此消息中提取作业 ID。例如:

$ jobid=$(qsub hello.sh | cut -d' ' -f3)
$ echo $jobid
8845481

也许您的 qsub 版本有不同的消息,请单独尝试一下,然后进行剪切以获取 jobid 作为字符串。

答案2

对于多年后偶然发现这一点的人来说:

我会用数组作业以避免编写 shell 脚本。您需要类似的东西run_IntersectBed_1.sh $SGE_TASK_ID,并需要提交qsub -t 1-3 -tc 1 Annotation_Loop.sh

这将创建一个包含 3 个作业的数组,编号分别为 1、2 和 3,每次运行一个作业 ( -tc 1)。您不再需要担心hold_jid

SGE_TASK_ID是保存当前作业的整数 ID 的位置。这是您传递给代码的内容(相当于i循环中的值)。

相关内容