我是非常新的shell脚本,我正在尝试编写一个提交多个qsub
作业的shell管道,但是有几个命令可以在这些qsub之间运行,取决于最近完成的工作。我一直在研究多种方法来尝试让shell脚本在提交qsub
作业后继续进行,但没有一个成功。
我可以提供的最简单的代码块来说明问题如下:
THREADS=`wc -l < list1.txt`
qsub -V -t 1-$THREADS firstjob.sh
echo "firstjob.sh completed"
在此之后显然还有其他代码行实际上取决于firstjob.sh整理,但为了清楚起见,我在此省略了它们。我尝试了以下暂停/保存脚本的方法:
1)仅使用wait
,它应该在所有后台程序完成之前停止脚本。在数组作业仍在运行时,这会向右推过wait
并将echo
语句打印到终端。我猜这是因为一旦提交了qsub
作业,退出并且wait
认为它已经完成了吗?
qsub -V -t 1-$THREADS firstjob.sh
wait
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)使用-sync y
qsub
。这应该可以防止它在作业完成之前退出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脚本(虚拟对象只生成一个空文件),以便我可以使用-W depend=afterok:
的{{1}}选项暂停脚本。这再次推送到 echo 语句,没有任何暂停提交虚拟脚本。这两个工作都是一个接一个地提交,没有暂停。
qsub
关于脚本的一些进一步细节:
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"
时在队列中看到它们。也许在大多数情况下都有一个简单的解决方法,但对于所有这些都是新手,我真的很挣扎。我必须在整个脚本中的8-10个位置使用此方法,因此它确实阻碍了进度。非常感谢任何帮助。感谢。
POST EDIT 1这是firstjob.sh中包含的代码......虽然怀疑它会有所帮助。这里的所有东西都按预期运行,总能产生正确的结果。
showq
答案 0 :(得分:0)
我刚尝试使用-sync y
,这对我很有用,那里有个好主意......不确定你的设置有什么不同。
但您可以尝试的其他一些事情涉及您的主脚本,了解您正在运行的qsub
个工作的状态。一个想法是,您可以让主脚本使用qstat
检查作业的状态,并等到它完成后再继续。
或者,您可以将第一个作业写入文件作为其最后一步(或者,如您所建议的那样,设置一个等待第一个作业完成的虚拟作业)。然后在您的主脚本中,您可以在继续之前测试该文件是否已被写入。