我正在尝试通过提供以下.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
循环中的值)。