SMS学习笔记4 SMS预处理器

目录

SMS学习笔记4 SMS预处理器

作用:
读取并处理SMS文件,生成job文件、说明文件或用于XCDP/CDP编辑的文件,同时,还解析SMSCMD和SMSKILL中的命令。进行变量替换。
语法:
SMSMICRO SMS宏字符,默认为%
%include   包含_%SMSINCLUDE%/filename文件,若SMSCLUDE不存在,则用SMSHOME代替。用绝对目录不会展开,不要包含变量。
%include “filename”     包含
%SMSHOME%/%SUITE%/%FAMILY%/filename_ 文件
%include filename        包含sms所在目录的_filename_,通常在SMSHOME目录。不过最好用绝对目录。
%includenopp              与include语法相同,但不解释脚本文件
%comment … %end    到%end之间都是注释,不包含在输出文件中
%manual   …  %end     输出job文件,不包括这部分;输出manual文件,只包含这部分
%nopp … %end            不解析中间的部分
%smsmicro CHAR       改变SMSMICRO,不影响SMSFETCH和SMSCMD
详细说明:
4.1 SMSFILES
查找顺序,参见《SMS学习笔记3》
4.2 SMS 说明文档
放在%manual 和 %end之间,可以多次出现。manual中也可以用%include包含其他说明文档。
作业包和作业族的说明文档在相关目录下的单独文件中,例如sutie/family1中的family1.man文件,同样包含在%manual和%end中。
4.3 包含文件
最简单的包含文件:开头 %include 结尾 %include
SMSINCLUDE
4.4 SMSFILES和SMSINCLUDE的典型用法
在定义suite后紧接着声明需要的SMS变量,如SMSFILES、SMSINCLUDE和SMSHOME等

set SUITE x
suite $SUITE
      edit SMSFILES /home/ma/map/def/$SUITE/smsfiles
      edit SMSINCLUDE /home/ma/map/def/$SUITE/include
      edit SMSHOME /tmp/map/sms

接着要确保发生错误要能被smsabort捕获,并用smsinit激活任务。下面是一个典型的头文件head.h

#!/bin/ksh
SMSNAME=%SMSNAME%
SMSNODE=%SMSNODE%
SMSPASS=%SMSPASS%
SMS_PROG=%SMS_PROG%
SMSTRYNO=%SMSTRYNO%
export SMSNAME SMSNODE SMSPASS SMSTRYNO SMS_PROG
ERROR() { echo ERROR ; $SMSBIN/smsabort; exit 1 ; }
trap ERROR 0
trap '{ echo "Killed by a signal"; ERROR ; }' 1 2 3 4 5 6 7 8 10 12
13 15 # list using kill -l or man kill
set -e
smsinit $$

最后,要用smscomplete结束任务。典型的头文件tail.h

smscomplete
trap 0
exit

可能需要更多的头文件。
4.5 注释
注释不可嵌套,manual中也就无法包含注释。
4.6 停止预处理
多数是为了使用%符号。
4.7 SMSFETCH
执行用户命令来获取文件,例如从版本控制系统中获取文件。
没有现实的例子,以后再补充。
4.8 SMSMICRO
修改预定义宏标志,不影响SMSCMD和SMSKILL
4.9 sms文件怎样生成job文件
预处理器处理预处理命令。
task.sms

%manual
OPERATORS: Set the task complete and report next day
%end
%include <head.h>
echo do some work
sleep %SLEEPTIME%
echo end of job
%include <end.h>

task.job

#!/bin/ksh
SMSNAME=/suite/family/task
SMSNODE=localhost
SMSPASS=xYz12AbC
SMS_PROG=314159
SMSTRYNO=1
export SMSNAME SMSNODE SMSPASS SMSTRYNO SMS_PROG
ERROR() { echo ERROR ; $SMSBIN/smsabort; exit 1 ; }
trap ERROR 0
trap '{ echo "Killed by a signal"; ERROR ; }' 1 2 3 4 5 6 7 8 10 12
13 15 # list using kill -l or man kill
set –e
smsinit $$
echo do some work
sleep 60
echo end of job
smscomplete
trap 0
exit