Obteniendo datos de ejecución de jobs del spool por REXX

Escrito por Javier
Adjuntos:
Descargar este archivo (datosspl.txt)Datos Spool[Rexx datos spool]3 kB
Descargar este archivo (datosspl_v22.txt)Datos Spool NUEVA VERSIÓN[Incluye campos fecha y hora de entrada a spool, MAX-RC. Se añade OWNER * y PREFIX **]3 kB

NOTA: Se añade versión nueva del código para añadir los campos, fecha y hora de entrada al spool y MAX-RC.

Esta ocasión vamos a sacar datos de los jobs que se encuentren en el spool usando REXX. Los datos que sacaremos serán la fecha de inicio y fin de los jobs, no incluye STCs, que hayan terminado de ejecutarse.

El código, con comentarios, es el siguiente:

/* REXX */
/* Extrae las fechas de inicio y fin de los jobs del spool (ST) */
/* Escrito por: JFG */
/* Fecha: 02/10/2017 */
rc=isfcalls('ON')
/* Seleccionar las columnas que vamos a usar */
isfcols = "jname jobid queue timee datee timen daten"
/* Filtrar las salidas por jobid JOB* y estado PRINT */
isffilter = "jobid eq JOB* queue eq PRINT"
/* Relacion entre los filtros jobid y queue = AND */
isffiltermode = "AND"
/* Ordenar por columnas St-Date y St-Time en ascendente */
isfsort = "datee A timee A"
/* Accede al panel ST de SDSF. Opcion DELAYED para usar todas
las columnas del panel. Opcion ALTERNATE para que funcione
isfsort con los campos St-Date (datee) y St-Time (timee) */
Address SDSF "ISFEXEC ST (DELAYED ALTERNATE)"
/* Comprobamos si se ha producido algun error en el acceso. */
lrc=rc
if lrc<>0 then
do
call msgrtn
exit 20
end
/* Guardar el numero maximo de lineas y creamos la cabecera
del fichero de salida.
x2c(05)->Es la tabulacion en hexadecimal al exportar a Excel */
numrows=isfrows
cabecera="JobName "||x2c(05)||"JobID "||x2c(05)||"F Inicio "||,
x2c(05)||"H Inicio "||x2c(05)||"F Fin "||x2c(05)||"H Fin"
/* Guardar la cabecera en una cola para escribirla en fichero */
queue cabecera
/* Recorrer los jobs del panel ST*/
do ix=1 to numrows
/* Formatear fecha incio a dd/mm/yyyy */
fechaI=fechaGre(DATEE.ix)
/* Formatear fecha fin a dd/mm/yyyy */
fechaF=fechaGre(DATEN.ix)
/* Guardar JobName JobID Fecha y Hora de inicio y fin */
datos=JNAME.ix||x2c(05)||JOBID.ix||x2c(05)||fechaI||,
x2c(05)||TIMEE.ix||x2c(05)||fechaF||x2c(05)||TIMEN.ix
/* Guardar los datos en una cola para escribir en fichero */
queue datos
end
rc=isfcalls('OFF')
Address TSO
"PROFILE NOPREFIX"
/* Comprobar si existe la libreria de salida */
LIBRERIA=SYSDSN(USERID().JOBS.SPOOL)
if LIBRERIA <> "OK" then
do
/* Si no existe, la cre */
"ALLOCATE F(FICH) DA("USERID()".JOBS.SPOOL) NEW TRACKS
DSORG(PS) SPACE(2,2) RECFM(F,B) LRECL(80) BLKSIZE(800)"
"FREE F(FICH)"
end
/* Grabar la informacion de la cola en la libreria de salida */
"ALLOCATE F(FICH) DA("USERID()".JOBS.SPOOL) OLD"
"EXECIO "queued()" DISKW FICH (FINIS"
"FREE F(FICH)"
Say "Comprobar salida en libreria "USERID()".JOBS.SPOOL"
Exit
/* Funcion para formatear la fecha juliana a dd/mm/yyyy */
fechaGre:
PARSE ARG fecha
/* Formatear de yyyy.ddd a yyddd */
fecha=Translate('34678',fecha,'12345678')
/* Pasar fecha juliana a yyyymmdd */
fecha=DATE('S',fecha,'J')
/* Formatear fecha yyyymmdd a dd/mm/yyyy */
fecha=Translate('78/56/1234',fecha,'12345678')
return fecha
/* Subrutina generica para controlar los errores */
msgrtn: procedure expose isfmsg isfmsg2.
/* The isfmsg variable contains a short message */
if isfmsg<>"" then
Say "isfmsg is:" isfmsg
/* The isfmsg2 stem contains additional descriptive */
/* error messages */
do ix=1 to isfmsg2.0
Say "isfmsg2."ix "is:" isfmsg2.ix
end
return

 

Guardamos el código en una librería que queramos. Si queremos ejecutarlo mediante el comando “TSO DATOSSPL”, debemos guardarlo en una librería que tengamos concatenada en la DD SYSPROC del procedimiento de logon de ISPF que estemos usando. También podemos guardarlo en una librería de usuario y ejecutarlo mediante “exec”.

 

Usamos el comando “TSO DATOSSPL”.

 

Saldrá un mensaje indicando “Comprobar salida en la librería XXXXXXXX.JOBS.SPOOL”. Las X son el usuario que estemos usando en ese momento.

 

Si tenemos el código en una librería de usuario, por ejemplo, IBMUSER.CLIST, lo ejecutamos con “exec” desde la opción 3.4.

 

Comprobamos que, en mi caso, los jobs del spool no están ordenados por fecha y hora de inicio.

 

 

Buscamos la salida que ha creado el REXX y entramos con “view”.

NOTA: Recomiendo entrar con view o edit poque con browse, las tabulaciones aparecen como puntos.

 

Comprobamos que no salen STCs y los datos están ordenados por fecha y hora de inicio.

 

Si queremos descargar el fichero para exportarlo a Excel, vamos a la opción 6 de ISPF.

NOTA: El transfer no funciona con versiones antiguas de Personal Communications (v5.8, v5.9). Se puede usar, por ejemplo, la versión 6.0.14 o ya las versiones 12.0.x.

Si no funciona el transfer, quizá se podrían usar otras opciones, como mandarlo por mail o FTP.

 

Pulsamos en el icono de “recibir un fichero del host”. Y rellenamos los datos.

 

Si abrimos el fichero txt, que hemos descargado, aparecerá con tabulaciones.

 

Si abrimos un Excel e importamos los datos desde texto, aparecerán distribuidos por filas y columnas, como una tabla.

 

 

Pulsamos siguiente hasta que solo se pueda pulsar finalizar.

 

Vemos que los datos están distribuidos en forma de tabla.

 

Una vez que tenemos los datos en Excel, ya podemos crear alguna macro, por ejemplo, para sacar cuanto tiempo ha estado ejecutándose cada job.

 

Visto: 1066

Comentarios  

0 #1 JESUS 01-04-2018 08:05
Hola Javi, Increíble que necesitase algo así y lo tuvieses en tu web-blog. Una pregunta sobre la REXX, necesitaría poder incluir al report el MAX-RC y, si es posible, si el JCL se ha ejecutado desde planificador, la fecha de planificación (oDate de Control-M o el CYYMMDD de OPC). Muchas gracias por tu trabajo.
Citar
+1 #2 Javier 02-04-2018 22:23
Buenas, Jesús

Me alegro de que te pueda servir la entrada.
He hecho una nueva versión del código y la puedes descargar al principio de la entrada "Datos Spool NUEVA VERSIÓN". Se incluye lo siguiente:
- Fecha y hora de entrada al spool (Rd-date y Rd-time). El motivo es por los jobs fallados por "JCL ERROR", entran al spool, pero no llegan a ejecutarse (St-date y St-time), por lo tanto, ese dato queda vacío.
- MAX-RC
- Se cambia la longitud de registro del fichero de salida de 80 a 120, para que entren los nuevos datos.

Te dejo unos enlaces por si quieres añadir alguna columna más, para que sepas cual es el nombre que debes usar

Nombre de las columnas según el panel (DA, ST, etc.)
https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.isfa500/isfjvdisp.htm

Nombre de las columnas del panel ST
https://www.ibm.com/support/knowledgecenter/SSLTBW_2.3.0/com.ibm.zos.v2r3.isfa500/isfjvstd.htm

Para saber si el JCL se ha ejecutado desde el planificador, quizás una forma de hacerlo podría ser si el "Owner" es el usuario que se utiliza para ejecutar los jobs desde el planificador. Un ejemplo: si el OWNER es "CTMUSER" es que el job viene de Control M.

Para saber la fecha de planificación, creo que tendrás que hacer una búsqueda posterior en los datos de CTM o de OPC para obtener la información. Por ejemplo, teniendo los JOBID del paso anterior, que generes un fichero AUDIT de OPC y busques la información ahí. En el caso de CONTROL M, no recuerdo ahora si la información la podrías obtener del job que hace el cambio de día ¿CTMDAY?. Se que el ODATE si viene, pero no recuerdo si también los jobid.
Si se me ocurre alguna otra forma, te digo.

Espero que te sirva de ayuda.

Un saludo.
Citar
0 #3 JESUS 04-04-2018 11:01
Hola Javi,

Muchas gracias. Seguiré investigando para ver como puedo sacar la info de fecha de planificación, aunque por lo que he comentado con unos compañeros, parece que voy a tener que sacar un reporte a partir del OPC, no del SPOOL. Una cosa, he ejecutado la rexx modificada y, si ejecuto con el IBMUSER salen todos los jobs pero desde un usuario comun solo salen las ejecuciones que se han realizado desde ese usuario ¿Como podría hacer que todos los usuarios puedan extraer todos los jobs con independencia de quien los ha ejecutado?

Muchas gracias y genial el trabajo.
Un saludo de un compañero >
Citar
+1 #4 Javier 05-04-2018 03:22
Buenas,

Con los parámetros "isfprefix" e "isfowner", usando REXX, puedes indicar que te aparezcan todos los jobs o los que tú desees. Por ejemplo:
isfprefix="ABC*"-> mostrará aquellos jobs que empiecen por ABC.
isfowner="IBMUSER" -> mostrará aquellos jobs cuyo OWNER sea IBMUSER

Si con tu usuario puedes ver los jobs de otros usuarios entrando por los paneles de SDSF, también deberías poder sacarlos a través de REXX.

Cuando entras a través de paneles SDSF, para saber si tienes algún prefix o owner puesto, desde el panel ST (por ejemplo), puedes usar el comando "SET DISPLAY ON" en la línea "COMMAND INPUT ===>" y te saldrá una línea de información similar a la siguiente:
"PREFIX=* DEST=(ALL) OWNER=* SORT=Pos/A SYSNAME= "

Si quieres quitar esa línea de información, lo podrás hacer con "SET DISPLAY OFF".

Desde la línea "COMMAND INPUT ===>", también podrás usar los comandos "OWNER *" y "PREFIX *" para ver todos los jobs desde los paneles de SDSF.

En los próximos días haré una entrada sobre SDSF explicando esas opciones y algunas más.

Te dejo un ejemplo del código para que veas dónde habría que indicarlo para que muestre todos los jobs:
rc=isfcalls('ON')
/* Prefijamos el nombre de los jobs para que aparezcan todos */
isfprefix="**"
/* Cambiamos el OWNER de los jobs para que aparezcan todos */
isfowner="*"
/* Seleccionar las columnas que vamos a usar */
isfcols="jname jobid queue retcode dater timer datee timee
timen daten"
/* Filtrar las salidas por jobid JOB* y estado PRINT */
isffilter = "jobid eq JOB* queue eq PRINT"

Lo dejo modificado en la versión 2 del código.

Espero que te sirva de ayuda.
Citar
0 #5 JESUS 18-04-2018 10:57
Hola Javi,

Muchas gracias por tu respuesta, ha funcionado perfectamente. Pero ahora me tengo un problema, distinto, que no se puede solucionar por la REXX. Tenemos procesos que se planifican desde el OPC de Z/OS que se ejecutan en sistemas distribuidos (UNIX y WINDOWS) y estos JCLs no dejan rastro en el spool. Aunque si que dejan datos (como fecha-hora inicio y fin) en OPC. Sería posible que hicieses un tutorial de como extraer la información desde la opción 7 de "Lista de Operaciones Históricas"? Según he visto por ahí, se tendría que usar EQQHISTL, pero no se si sería posible incluir más info al report que genera (o atacar a la tabla DB2 donde se guarda la información) para obtener el OYMD1 con el que se planifica, hora fin, resultado ejecución, etc....

Muchas gracias y un saludo.
Citar
0 #6 Javier 25-04-2018 02:10
Buenas Jesús

Dependiendo de la instalación, es posible que la opción del histórico de operaciones no esté habilitada.

Otra opción podría ser por JCL (PGM=EQQYCAIN). Tendrías que generar un report del antes de la extensión del Current Plan. En ese report, tendrías los siguientes datos y algunos más:

JOB NAME
WORKSTATION NAME
PLANNED START DATE
PLANNED START TIME
PLANNED END DATE
PLANNED END TIME
ACTUAL START DATE
ACTUAL START TIME
ACTUAL ARRIVAL DATE
ACTUAL ARRIVAL TIME
ACTUAL END DATE
ACTUAL END TIME
CURRENT STATE

También tendrías que tener en cuenta si durante el día se van haciendo algún "replan" antes de la extensión, porque perderás la información de los jobs que ya estén completados.

Después este report tendrías que "formatearlo" para quedarte con la información que te interesa para que se vean mejor los datos.

Si crees que te puede ser de ayuda, puedo hacer una entrada dedicada a explicarlo.
Citar

Escribir un comentario


Código de seguridad
Refescar