保留其余的shell脚本命令,直到PBS qsub数组作业完成
我对shell脚本非常陌生,我正在尝试编写一个shell管道,它提交多个保留其余的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) 将作业设置为
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
\#! /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"