Depois de extensivas pesquisas, encontrei uma solução que, ao ser implementada, resolveu o meu problema. Imagine a seguinte circunstância: era necessário obter o resultado de um comando inserido no console e armazená-lo em um conjunto de dados (dataset) para posterior processamento por meio de um programa Natural, com o objetivo de apresentar as informações desejadas. No meu caso, precisava verificar se os aplicativos no mainframe estavam online, o que era visível ao executar o comando 'D A,L' no console. A questão era como capturar esse resultado na console e gravá-lo em um dataset.
Após dedicar um tempo significativo à pesquisa para solucionar esse desafio, encontrei um JCL (Job Control Language) que permitia obter o resultado do comando no console e gravá-lo em um dataset. Em seguida, usando um programa Natural, consegui realizar o filtro necessário para extrair as informações desejadas. No exemplo abaixo, demonstrarei como gravar no dataset a porcentagem de utilização do SMF:
Após rodar esse job o dataset AAF.S.TSSUSER4 gravou essas informações - que a gente quer trabalhar no programa natural
Este foi o programa Natural criado para pegar somente as informações do SMF que eu quero
Rodando este JCL (pois vou gravar em um arquivo temporario) e vou usar o filtro que vamos usar do programa Natural
Este é o resultado que vai sair da sysout do job
Depois de conseguir fazer isso foi um passo enviar e-mail para monitorar os aplicativos online no mainframe.
Após dedicar um tempo significativo à pesquisa para solucionar esse desafio, encontrei um JCL (Job Control Language) que permitia obter o resultado do comando no console e gravá-lo em um dataset. Em seguida, usando um programa Natural, consegui realizar o filtro necessário para extrair as informações desejadas. No exemplo abaixo, demonstrarei como gravar no dataset a porcentagem de utilização do SMF:
MEMBER=@SDSF 000017 REC SAVE:03.05.2016 15:10 BY USERID DBA2555 R=00000001
DSN=AAB.DIBD.JCLS LIB=S3 VOL=PRL303 UNIT=1526
....+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8
//AAFSNATB JOB (AAF,TSS),'CLAU',CLASS=S,MSGCLASS=A
//*UQ ALLOW
//* ----------------------------------------------------
//* COMANDO DE JES2 - PELO SDSF
//* ----------------------------------------------------
//SDSF EXEC PGM=SDSF
//* ISFOUT DD SYSOUT=*
//ISFOUT DD DSN=AAF.S.TSSUSER4,DISP=SHR
//LOGOUT DD SYSOUT=*
//ISFIN DD *
SET CONSOLE BATCH
SET DELAY 600
/D SMF
PRINT FILE CMDOUT
ULOG
PRINT
PRINT CLOSE
Após rodar esse job o dataset AAF.S.TSSUSER4 gravou essas informações - que a gente quer trabalhar no programa natural
Menu Utilities Compilers Help
-------------------------------------------------------------------------------
BROWSE AAF.S.TSSUSER4 Line 00000180 Col 001 080
HQX7730 ----------------- SDSF PRIMARY OPTION MENU COMMAND ISSUED
COMMAND INPUT ===> SCROLL ===> PAGE
RESPONSE=CPAC
IEE949I 10.20.04 SMF DATA SETS 808
NAME VOLSER SIZE(BLKS) %FULL STATUS
P-SYS1.MAN1 PRD27A 368640 46 ACTIVE
S-SYS1.MAN2 PRD27A 368640 0 ALTERNATE
S-SYS1.MAN3 PRD27A 368640 0 ALTERNATE
NODE Nodes
LOG System log SO Spool offload
SR System requests SP Spool volumes
MAS Members in the MAS
JC Job classes RM Resource monitor
SE Scheduling environments CK Health checker
RES WLM resources
ENC Enclaves ULOG User session log
PS Processes
Command ===> Scroll ===> PAGE
F1=Help F2=Split F3=Exit F5=Rfind F7=Up F8=Down F9=Swap
F10=Left F11=Right F12=Cancel
Este foi o programa Natural criado para pegar somente as informações do SMF que eu quero
> > + Program AAFSCSA1 Lib SUPORTE2
Top ....+....1....+....2....+....3....+....4....+....5....+....6....+....7..
0010 ** ----------------------------------------------------------------
0020 ** PROCEDIMENTO: FAZ UM FILTRO DO SMF RELATORIO % ATUAL
0030 ** AUTOR : CLAUDEMAR MARTINS DE SA
0040 ** DATA : 31/01/2020
0050 ** ----------------------------------------------------------------
0060 DEFINE DATA LOCAL
0070 1 #CONT (A04)
0080 1 #SMF1 (A88)
0090 1 REDEFINE #SMF1
0100 2 FILLER 13X
0110 2 #NOME_SMF (A09)
0120 2 FILLER 1X
0130 2 #VOLSER (A06)
0140 2 FILLER 1X
0150 2 #SIZE (A10)
0160 2 FILLER 1X
0170 2 #FULL (A5)
0180 2 FILLER 1X
0190 2 #STATUS (A9)
0200 ****
0210 1 #SMF2 (A88)
0220 1 REDEFINE #SMF2
0230 2 FILLER 13X
0240 2 #NOME_SMF_2 (A09)
0250 2 FILLER 1X
0260 2 #VOLSER_2 (A06)
0270 2 FILLER 1X
0280 2 #SIZE_2 (A10)
0290 2 FILLER 1X
0300 2 #FULL_2 (A5)
0310 2 FILLER 1X
0320 2 #STATUS_2 (A9)
0330 END-DEFINE
0340 * ---------------------------------------------------------------
0350 READ WORK FILE 1 #SMF1 #CONT
0360 IF #NOME_SMF = 'SYS1.MAN1' OR = 'SYS1.MAN2' OR = 'SYS1.MAN3'
0370 * ---------------------------------------------------------------
0380 MOVE #NOME_SMF TO #NOME_SMF_2
0390 MOVE #VOLSER TO #VOLSER_2
0400 MOVE #SIZE TO #SIZE_2
0410 MOVE #FULL TO #FULL_2
0420 MOVE #STATUS TO #STATUS_2
0430 * ---------------------------------------------------------------
0440 WRITE WORK FILE 2 #SMF2
0450 * ---------------------------------------------------------------
0460 END-IF
0470 END-WORK
0480 END
Rodando este JCL (pois vou gravar em um arquivo temporario) e vou usar o filtro que vamos usar do programa Natural
//AAFSNATB JOB (AABS,DIST),CLAUDEMAR,CLASS=S,MSGCLASS=A
//*UQ ALLOW
//* ----------------------------------------------------------------
//* CHECANDO OS APLICATIVOS ONLINE NO MAINFRAME
//* ----------------------------------------------------------------
//SDSF EXEC PGM=SDSF
//ISFOUT DD DSN=&&TEMP01,DISP=(NEW,PASS),SPACE=(CYL,2),UNIT=SYSDA,
// DCB=(LRECL=133,BLKSIZE=1330,RECFM=FBA)
//ISFIN DD *
SET CONSOLE BATCH
SET DELAY 600
ULOG
/D SMF
END
//* ----------------------------------------------------------------
//* FAZENDO UM FILTRO PARA COLETAR AS INFORMACOES
//* ----------------------------------------------------------------
//NATD EXEC NATURAL,PARM1='SYS=D,MT=0,STACK=(LOGON SUPORTE2)'
//CMWKF01 DD DSN=&&TEMP01,DISP=SHR
//CMWKF02 DD SYSOUT=G
//SYSOUT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//CMPRT01 DD SYSOUT=*
//SYSIN DD *
AAFSCSA1
/*
Este é o resultado que vai sair da sysout do job
SYS1.MAN1 PRD27A 368640 0 ALTERNATE
SYS1.MAN2 PRD27A 368640 38 ACTIVE
SYS1.MAN3 PRD27A 368640 0 ALTERNATE
UQS0009 - END OF DATA SET.
--------------------------------------------------------------------------------
OP=S CL=ALL IN=ALL JB=AAFSNATB,05777 DS=2 SI=SO LR=1 LL=80 PP=0 DC= RL=999999
AD=J DE= SC= PT= SQ=C RR=0 OC= SD=2000 03.02.2020, 9:42:25
Depois de conseguir fazer isso foi um passo enviar e-mail para monitorar os aplicativos online no mainframe.
Muito interessante Claudemar!
ResponderEliminar