PBS作业脚本处理

由于应用的特殊性,需要限制每个计算节点的ppn不能太多。但torque的手册中找不到关于ppn的属性限制,即使能限制的话也是限制提交脚本中的文本,而无法进行数量的控制,因此需要在qsub前进行输入脚本的检查。

需求:从作业脚本里面读取队列名和ppn,对于q1.1-q1.4要求ppn=2,q2.1-q2.16要求ppn=1;如果ppn不正确就给用户提示并退出,如果正确就调用系统原来的qsub提交任务。

首先是队列的获取,直接用sed获取即可,只需匹配到#PBS -q 后的字符串即可。根据需求,只需区分是q1还是q2即能满足要求:

sed -n ‘s/^#PBS.*-q \([0-9a-zA-Z.]\{2\}\).*/\1/p’ $1

其次是ppn的值。在作业脚本中,#PBS -l行中,可能有多个字段描述ppn,那么首先需要单独将ppn取出来。用sed、awk、tr都可以,但其实grep是最简单的。grep有个-o的选项,可以只将匹配到的内容显示出来而不是显示整行:

cat $1 | grep “^#PBS -l” | grep -o ‘ppn=[0-9]*’

由于可能存在多个ppn字段,所以需要通过循环判断出最大的ppn设置。

脚本如下:

#!/bin/bash

if [ “$1” = “” -o ! -f “$1” ]
then echo “Please put the job scpript file in the place close to the command $0, as \”$0 example.pbs\””
exit 1
fi

QUEUE=`sed -n ‘s/^#PBS.*-q \([0-9a-zA-Z.]\{2\}\).*/\1/p’ $1`
PPNMAX=0
for PPN in `cat $1 | grep “^#PBS -l” | grep -o ‘ppn=[0-9]*’ |tr -d ‘ppn=’`
do
if [ $PPN -gt $PPNMAX ]
then
PPNMAX=$PPN
fi
done

if [ $QUEUE = q2 -a $PPNMAX -gt 1 ]
then echo “for queue 2.x, the max ppn is 1, please revise your script and try again”
exit 1;
fi

if [ $QUEUE = q1 -a $PPNMAX -gt 2 ]
then echo “for queue 1.x, the max ppn is 2, please revise your script and try again”
exit 1;
fi

qsub $*

exit $?



此条目发表在Linux分类目录,贴了, , , 标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。

验证图片

*