1. 背景
在z/OS SYSPLEX环境下,经常会有一批JCL jobs运行在不同的LPAR上,每一个job会在自己的job log中产生相应的输出。有一种场景,需要在不同的LPAR上运行同一类JCL jobs, 在这些jobs运行结束,分析在此SYSPLEX上所有此类jobs所产生的job logs,并给出summary报告。图1显示了一种以层次型输出job logs summary信息的方式。
如图:1-01
1-01 层次型信息summary
2. 解决方案
对于背景中描述的场景,很自然想到用多维数组来实现,但对于大多数语言来说,数组的长度是固定的,不能动态变化,而且,其每个层次中的Entity数量是未知的。REXX 中没有多维数组的概念,但有与数组概念相似的Compound Variables and Stems的定义。
通过对REXX stem变量使用方法的分析,我们决定采用多维stems来存取背景中所述的summary信息。具体如下:
Stem.X : 用于存储LPAR name (which system the job runs on)
Stem.X.Y : Job log name
Stem.X.Y.Z : Status blocks
2.1 构建层次型信息LPAR, JOB LOG, Status blocks
2.1.1 使用REXX分析Job log的一般步骤
使用isfcalls 激活SDSF 对REXX的支持
设置SDSF special variables 定制要获取的信息
比如:isfPREFIX, isfOWNER, isfFILTER
获取指定的Job log list
ADDRESS SDSF "ISFEXEC ST" /* STatus command */
打开一个Job log
ADDRESS SDSF "ISFACT ST TOKEN('"SYSTSPRT.1"') PARM(NP SA)"
读取Job log的内容
"execio * diskr "isfddname.1" (stem spool.)"
2.1.2 存储LPAR name到Stem.X
通过上节III)中的命令可以获取指定job log list, 并得到SYSAFF., JNAME. 等stem变量。其中SYSAFF. 保存system/lpar name, JNAME.保存Job log name信息。
通过以下代码片段(循环执行)可以完成对LPAR name的存储:
lpar_name = SYSAFF.i x_idx = x_idx + 1; Stem.x_idx = lpar_name; Stem.0 = x_idx; curr_x_idx = x_idx // 记录当前到LPAR name Stem.的index |