保留其余的shell脚本命令,直到PBS qsub数组作业完成

保留其余的shell脚本命令,直到PBS qsub数组作业完成,shell,wait,chaining,qsub,Shell,Wait,Chaining,Qsub,我对shell脚本非常陌生,我正在尝试编写一个shell管道,它提交多个qsub作业,但在这些qsub之间要运行几个命令,这些命令取决于最近完成的作业。我一直在研究多种方法,试图在提交qsub作业后阻止shell脚本继续运行,但都没有成功 我可以提供最简单的代码块来说明这个问题,如下所示: THREADS=`wc -l < list1.txt` qsub -V -t 1-$THREADS firstjob.sh echo "firstjob.sh completed" 2) 将作业设置为

我对shell脚本非常陌生,我正在尝试编写一个shell管道,它提交多个
qsub
作业,但在这些qsub之间要运行几个命令,这些命令取决于最近完成的作业。我一直在研究多种方法,试图在提交
qsub
作业后阻止shell脚本继续运行,但都没有成功

我可以提供最简单的代码块来说明这个问题,如下所示:

THREADS=`wc -l < list1.txt`
qsub -V -t 1-$THREADS firstjob.sh
echo "firstjob.sh completed"
2) 将作业设置为变量,回显该变量以提交作业,并使用整个作业ID以及
wait
暂停。echo命令应等待阵列作业的所有元素完成。错误消息显示在代码后面的代码块中

job1=$(qsub -V -t 1-$THREADS firstjob.sh)
echo "$job1"

wait $job1

echo "firstjob.sh completed"

####ERROR RECEIVED#### 
-bash: wait: `4585057[].cluster-name.local': not a pid or valid job spec
3) 对
qsub
使用
-sync y
。这应该可以防止它退出
qsub
,直到作业完成,起到有效暂停的作用……我希望如此。命令后的注释出错。出于某种原因,它没有正确读取-sync选项

qsub -V -sync y -t 1-$THREADS firstjob.sh

echo "firstjob.sh completed"

####ERROR RECEIVED####
qsub: script file 'y' cannot be loaded - No such file or directory
4) 使用一个虚拟shell脚本(虚拟脚本只是生成一个空文件),这样我就可以使用
qsub
-W depend=afterok:
选项暂停脚本。这会再次直接推送到echo语句,而不会暂停提交伪脚本。两个作业都被提交,一个接一个,没有停顿

job1=$(qsub -V -t 1-$THREADS demux.sh)
echo "$job1"

check=$(qsub -V -W depend=afterok:$job1 dummy.sh) 
echo "$check"

echo "firstjob.sh completed"
有关脚本的更多详细信息:

  • 每个作业提交都是一个数组作业
  • 管道在终端中运行时使用的命令类似于以下命令,因此我可以为其提供3个输入:source pipeline.sh-r list1.txt-d/workingDir/-s list2.txt
  • 我确信firstjob.sh实际上还没有完成运行,因为当我使用
    showq
    时,我在队列中看到它们
也许在大多数情况下都有一个简单的解决方案,但作为一个新手,我真的很挣扎。在整个脚本中,我必须在8-10个地方使用这种方法,因此它确实阻碍了进度。如有任何帮助,我将不胜感激。谢谢

后期编辑1 这是firstjob.sh中包含的代码,尽管它是否有用还值得怀疑。这里的一切都按预期运行,总是产生正确的结果

\#! /bin/bash
\#PBS -S /bin/bash
\#PBS -N demux
\#PBS -l walltime=72:00:00
\#PBS -j oe
\#PBS -l nodes=1:ppn=4
\#PBS -l mem=15gb

module load biotools
cd ${WORKDIR}/rawFQs/

INFILE=`head -$PBS_ARRAYID ${WORKDIR}${RAWFQ} | tail -1`
BASE=`basename "$INFILE" .fq.gz`

zcat $INFILE | fastx_barcode_splitter.pl --bcfile ${WORKDIR}/rawFQs/DemuxLists/${BASE}_sheet4splitter.txt --prefix ${WORKDIR}/fastqs/ --bol --suffix ".fq"

我刚刚尝试使用了
-sync y
,这对我来说很有效,所以这是个好主意。。。不确定你的设置有什么不同

但是,您还可以尝试做一些其他事情,包括让主脚本了解正在运行的
qsub
作业的状态。一个想法是,您可以让主脚本使用
qstat
检查作业的状态,并等待它完成后再继续


或者,您可以将第一个作业写入文件作为其最后一步(或者,如您所建议的,设置一个等待第一个作业完成的虚拟作业)。然后,在主脚本中,您可以测试该文件是否已写入,然后再继续操作。

请编辑您的Q,将相关代码包含在
firstjob.sh
中,并指出您在哪里使用将响应
wait
的后台进程。祝你好运,谢谢谢勒。我不完全清楚你评论的第二部分是什么意思,你能详细说明一下吗?“响应
等待的进程”?是的,哎呀,我现在意识到您正在将作业传递给
qsub
,并且它正在管理分叉子进程(我假设),因此不一定会涉及
&
。但这意味着使用
wait
对您没有帮助。我唯一能想到的就是让你的
qsub
作业在一个步骤完成后编写唯一的标志文件,然后让你的脚本等待这些文件出现。包括状态信息(已处理记录、错误、警告等)的标志文件的额外积分。由于这里
qsub
的关注者很少,我想找一个qsub特定的支持论坛。祝你好运也许你需要
-sync=y
?我会跟进
qsub
社区关于“是否
-sync
按我需要工作”。祝你好运
\#! /bin/bash
\#PBS -S /bin/bash
\#PBS -N demux
\#PBS -l walltime=72:00:00
\#PBS -j oe
\#PBS -l nodes=1:ppn=4
\#PBS -l mem=15gb

module load biotools
cd ${WORKDIR}/rawFQs/

INFILE=`head -$PBS_ARRAYID ${WORKDIR}${RAWFQ} | tail -1`
BASE=`basename "$INFILE" .fq.gz`

zcat $INFILE | fastx_barcode_splitter.pl --bcfile ${WORKDIR}/rawFQs/DemuxLists/${BASE}_sheet4splitter.txt --prefix ${WORKDIR}/fastqs/ --bol --suffix ".fq"