问题描述
#!/bin/bash
totT=0
for a in `seq -w 3.5 0.1 4.5`
do
echo "a= $a"
cat >POSCAR <<!
Al FCC
1.0
$a 0.00 0.00
0.00 $a 0.00
0.00 0.00 $a
4
Direct
0.0 0.0 0.0
0.5 0.0 0.5
0.5 0.5 0.0
0.0 0.5 0.5
!
###I want to write a command to submit vasp.sh to PBS queue within the loop. How can I do it?
qsub vasp.sh
qsub -sync y vasp.sh
###
V=`grep volume/ion OUTCAR | awk '{print $5/4}'`
E=`tail -n1 OSZICAR | awk '{print $5/4}'`
totT=`echo $totT $T|awk '{print $1+$2}'`
echo $a $E >> EvsA
echo $V $E >> EvsV
./cleanup.sh
done
您好,我正在尝试编写一个 Bash 脚本,该脚本在另一个名为 vasp.sh 的脚本上循环,该脚本将 POSCAR 作为输入,并生成 OUTCAR 和 OSZICAR 作为输出。但是我希望每次迭代中的 vasp.sh 在下一次迭代开始之前完成执行,因为我想在每次迭代中使用 cleanup.sh 删除它们之前对输出文件做一些事情。我尝试 qsub -sync y vasp.sh 在下一次迭代之前等待作业完成,但终端显示“s”、“y”、“n”是无效选项。有人可以教我正确的方法吗?
解决方法
我不确定如何决定将“-sync”选项传递给 qsub。qsub 的手册页根本没有提到这些选项。
我能想到两种方法来做你想做的事。
1 - 除非作业完成,否则您可以提交作业并制作 qsub 块。 "qsub -Wblock=True vash.sh" 应该这样做。我不会推荐此选项,因为根据您所在综合设施中的工作量,您永远无法猜测工作何时会结束。
2 - 我建议使用作业依赖来提交您的作业。提交第一个作业后,捕获其作业 ID 并将后续作业提交为 - "qsub -Wdepend=after:vasp.sh"。这样做将确保您的工作流程得到遵循,并且作业一个接一个地运行。