Planificación de trabajos con mainframes

Autor: Kujaku | El miércoles 08 de agosto del 2007 @ 17:14.

El articulo de hoy surge de una necesidad que tuve en z/OS de poder planificar la ejecución de algunos Jobs diáriamente y a una hora determinada. Actualmente, existen multitud de herramientas como ControlM de BMC o Tivoli Netview para poder planificar la ejecución de procesos Batch, con una alta configurabilidad.

Pero si carecemos de estas herramientas, y lo único que se quiere es ejecutar una serie de jobs (como por ejemplo, recogida y guardado de logs diarios), el siguiente documento explica como hacer un pequeño procedimiento que use la capacidad del JES2 para planificar ejecuciones de jobs.

Esta "receta" me la pasó un compañero y buen amigo llamado Rafael Pereira (rptv2003 en yahoo punto com), gurú de MVS conocido entre otras cosas por participar en el proyecto MSUMON, monitor de MSUs consumidas por la máquina y que avisa cuando está a punto de llegar al Capping Soft.

Preparación de una STC.

Lo primero de todo, es preparar un procedimiento que permita hacer un submit desde la consola MVS. Una STC es una Started Task, una especie de proceso que se ejecuta en memoria mediante comandos MVS y que reside en un dataset especial de procedimientos, es decir, es como si fuera un JCL pero que se puede ejecutar desde consola MVS, con un comando llamado START (o S, abreviando).

Para ello, crearemos una STC la cual guardaremos en la PROCLIB de nuestro sistema (SYS1.PROCLIB, por ejemplo):

//SUBJOB  PROC CLASS='A',                   CLASE POR OMISION PARA CLASS
//             LIST='*',                    CLASE PARA SYSPRINT
//             LIB='YGGDRASL.SISTEMAS.JCL', DSNAME LIBRERIA POR OMISION
//             MEM=PLANIF                   NOMBRE DEL MIEMBRO EN LIB
//*
//IEFPROC  EXEC PGM=IEBEDIT
//SYSPRINT DD   SYSOUT=&LIST
//SYSUT1   DD   DDNAME=IEFRDER
//SYSUT2   DD   SYSOUT=(&CLASS,INTRDR),DCB=BLKSIZE=80
//SYSIN    DD   DUMMY
//IEFRDER  DD   DISP=SHR,DSN=&LIB.(&MEM.)

La STC SUBJOB lee el JCL del miembro &LIB.(&MEM.) y lo escribe en una internal reader. Como resultado, el JCL se ejecuta. De esta forma ejecutamos un JCL a través de un comando MVS desde consola como éste:

S SUBJOB,LIB=MI.LIBRERIA.DE.JCL,MEM=MIJCL

Por comodidad, definimos una librería como librería por omisión en la STC, por ejemplo, YGGDRASL.SISTEMAS.JCL. Si el JCL a ejecutar reside en la librería por omisión, el comando necesario es más corto:

S SUBJOB,MEM=MIJCL2

De todas formas, hemos rizado el rizo, también hemos definido el parámetro PLANIF en esta STC, por lo que haciendo un S SUBJOB nos ejecutará el JCL PLANIF dentro de la librería YGDDRASL.SISTEMAS.JCL.

Ejecución de un comando MVS a una hora determinada.

El comando $TA de JES2 permite programar la ejecución de un comando de JES2 a una hora determinada. Por ejemplo: $TA,T=14.30,'$DI' programa la ejecución del comando $DI a las 14:30.

El comando de JES2 $VS permite emitir un comando MVS, así que combinando $TA y $VS podemos programar la ejecución de un comando MVS a una hora determinada.

Por ejemplo: $TA,T=16.00,'$VS,''D T''' (ojo con los apóstrofes) programa la ejecución del comando MVS de consola 'D T' a las 16:00.

Emitir comandos de JES2 enviando al Internal Reader un miembro

de una librería. ##

Una forma muy útil de emitir varios comandos de JES2 consiste en escribirlos en un miembro de una librería o dataset. Escribimos un comando por línea, precedidos por los caracteres '/*' en la columna 1. Por ejemplo, el miembro PRUEBA podría contener:

----+----1----+----2----+----3----+----4----+----5
/*$DI
/*$VS,'D T'

Si ahora ejecutamos un 'SUB' del miembro desde ISPF se ejecutarán ambos comandos. Fijaos que el miembro no necesita tener ficha JOB, ni ficha EXEC ni nada de eso. Sólo los comandos de JES2 precedidos de '/*'.

Por supuesto, obtendríais el mismo resultado con la STC SUBJOB:

 :::text  
 S SUBJOB,MEM=PRUEBA

O bien:

 :::text
 S SUBJOB,LIB=MI.LIBRERIA.DE.JCLS,MEM=PRUEBA

Si el miembro PRUEBA no está en la librería por omisión especificada en la STC SUBJOB.

Programar comandos JES2 y MVS a una determinada hora

diariamente. ##

Ahora hay que construir un miembro con todos los comandos que queramos programar diariamente. Se debe empezar el miembro con el comando '$CA,ALL' y se debe terminar programando la ejecución del propio miembro a las 24:00 y, a continuación, emitiendo el comando '$SA,ALL'.

Por ejemplo, supongamos que el miembro se llama PLANIF y que reside en la librería por omisión de la STC SUBJOB (YGGDRASL.SISTEMAS.JCL).

Su contenido podría ser algo así:

----+----1----+----2----+----3----+----4----+----5
/*$CA,ALL
/*$TA,T=9.00,'$VS,''D T'''
/*$TA,T=9.10,'$VS,''S SUBJOB,LIB=YGGDRASL.SMF.JCL,MEM=SMFSTART'''
/*$TA,T=9.15,'$VS,''S SUBJOB,LIB=YGGDRASL.SMF.JCL,MEM=SMFDAILY'''
/*$TA,T=24.00,'$VS,''S SUBJOB,MEM=PLANIF'''
/*$SA,ALL

Con esto lo tendríamos casi todo hecho. Si ahora emitimos en consola el comando: S SUBJOB.

Todo se pondrá en marcha. Se ejecutarán los comandos de PLANIF. Como resultado, se pasará a tener programados
todos los comandos que hayamos incluido en PLANIF. Y la cosa se repetirá todos los días gracias al comando que hemos programado a las 24:00. Sólo falta hacer que todo se inicie en IPL.

Puesta en marcha del "planificador" en IPL.

Localizaremos en la PARMLIB el miembro IEASYSxx que utilicemos en IPL. Fijaos en el valor que tiene el parámetro CMD= dentro del miembro IEASYSxx. El parámetro CMD=xx apunta al miembro o miembros COMMNDxx también residentes en la PARMLIB cuyo contenido se ejecuta en IPL, como si fuera un "AUTOEXEC.BAT" o algo por el estilo.

Añadimos el comando siguiente al COMMNDxx que estemos utilizando:

COM='S SUBJOB,MEM=PLANIF'

O:

COM='S SUBJOB'

A secas, ya que el miembro PLANIF está por omisión. Y eso debería ser todo. Por supuesto, la definición de una STC que ejecute JCLs requiere unas cuantas autorizaciones de RACF, pero sería muy largo y complicado dar una receta general de todo lo necesario porque depende de qué definiciones tengamos ya disponibles en nuestro sistema. Así que he preferido dejar todo eso de lado.

Comentarios