Muchas veces hay procesos batch que tenemos ejecutando en el sistema y que queremos monitorear de manera automática. Es decir, si el job se encuentra en MSGW, LCKW, etc. Se pueda cancelar y lanzar nuevamente.
En esta primera parte lo hacemos de manera “artesanal” por decirlo de alguna manera.
A continuación el programa CL que será sometido para monitorear el Job.
Parametros:
Jobname = Nombre del Job a monitorear
Sbsname = Subsistema donde se encuentra ejecutando el Job
PGM PARM(&JOBNAME &SBSNAME) DCL VAR(&JOBNAME) TYPE(*CHAR) LEN(10) DCL VAR(&SBSNAME) TYPE(*CHAR) LEN(10) /* Datos de trabajo actual */ DCL VAR(&NROJOB) TYPE(*CHAR) LEN(6) DCL VAR(&NAMJOB) TYPE(*CHAR) LEN(10) DCL VAR(&USRJOB) TYPE(*CHAR) LEN(10) DCLF FILE(QTEMP/PLANO) RTVJOBA JOB(&NAMJOB) USER(&USRJOB) NBR(&NROJOB) DLTF FILE(QTEMP/PLANO) MONMSG MSGID(CPF0000) CRTPF FILE(QTEMP/PLANO) RCDLEN(132) /* La pantalla del comando WrkActJob se deposita en archivo */ WRKACTJOB OUTPUT(*PRINT) SBS(&SBSNAME) CPYSPLF FILE(QPDSPAJB) TOFILE(QTEMP/PLANO) + JOB(&NROJOB/&USRJOB/&NAMJOB) SPLNBR(*LAST) DLTSPLF FILE(QPDSPAJB) JOB(&NROJOB/&USRJOB/&NAMJOB) + SPLNBR(*LAST) LOOP: RCVF MONMSG MSGID(CPF0864) EXEC(DO) DLYJOB DLY(60) TFRCTL PGM(MONITOR) PARM(&JOBNAME &SBSNAME) ENDDO /* Si el job esta en MSGW se finaliza y somete nuevamente */ IF COND(%SST(&PLANO 4 10) *EQ &JOBNAME *AND + %SST(&PLANO 111 4) *EQ 'MSGW') THEN(DO) CHGVAR VAR(&NAMJOB) VALUE(%SST(&PLANO 04 10)) CHGVAR VAR(&USRJOB) VALUE(%SST(&PLANO 17 10)) CHGVAR VAR(&NROJOB) VALUE(%SST(&PLANO 29 06)) ENDJOB JOB(&NROJOB/&USRJOB/&NAMJOB) OPTION(*IMMED) + DELAY(1) DLYJOB DLY(120) SBMJOB CMD(CALL PGM(MILIBRERIA/MIPROGRAMA)) + JOB(&JOBNAME) JOBQ(&SBSNAME) ENDDO GOTO CMDLBL(LOOP) ENDPGM |
2 cosas importantes:
- Luego de finalizar el job espero 2 minutos para estar seguro que el Job finalizó antes de someterlo nuevamente, puesto que a veces se demora en generar el joblog, cerrar los programas de servicio, etc. Esto es para evitar posibles bloqueos de archivos u otro tipo de objetos.
- Al finalizar la lectura del archivo plano que contiene información del comando WRKACTJOB *PRINT, se realiza la llamada recursiva al programa con el comando TFRCTL, esto permite que entre en un bucle infinito, pero controlado por un DLYJOB de 1 minuto.
Al ejecutar el comando WRKACTJOB OUTPUT(*PRINT) SBS(QBATCH2) obtendremos el siguiente reporte en el spool.
necesito conocer lo siguiente: como saber cuando un trabajo está en status RUN pero ya lleva más de 1 minutos o más activo. gracias, mandar ejemplo a jorgeb@prodigy.net.mx
ResponderEliminar