Hola a todos
Otra forma ser�a controlar si existe un trabajo con un nombre determinado
ejecutandose en el sistema. Si el trabajo a controlar siempre tiene el mismo
nombre se puede hacer un control sobre el.
Adjunto envio el fuente de un programa que monitoriza si se esta ejecutando
otro proceso y en caso contrario lo lanza. El proceo pueder a la inversa, es
decir, si esta funcionando que no se pueda lanzar mas veces.
Un saludo
Fernando Martinez
-----Mensaje original-----
De: [EMAIL PROTECTED]
[mailto:[EMAIL PROTECTED] nombre de Jesus
Busquets/NOTES/ES
Enviado el: lunes, 24 de febrero de 2003 12:41
Para: [EMAIL PROTECTED]
Asunto: RE: IF ACTIVE .....
Lo que pasa con este sistema es que se puede, efectivamente, llamar al
programa desde fuera, y est� permitido..
pero si el programa mismo que se ejecuta se bloquea a s� mismo en modo
exclusivo, no puede ser llamado por nadie m�s hasta que acaba, y adem�s, si
finaliza con error da igual, al acabar el trabajo se desbloquea (en el caso
en que estemos hablando de procesos batch, claro)
He aqu� un microprograma que sirve para probar esto (bueno, ya se que
parece m�s un "programa del viernes", pero cumple su cometido.)
El programa se llama TSTBLQ y est� en una biblioteca el *LIBL
PGM /* Para probar el funcionamiento de bloqueos del mismo programa */
ALCOBJ OBJ((TSTBLQ *PGM *EXCL)) WAIT(5)
MONMSG MSGID(CPF1002) EXEC(GOTO BLOQUEO)
SNDPGMMSG MSG('Acabo de bloquearme') TOPGMQ(*EXT)
DLYJOB DLY(60) /* Hacemos como que estamos haciendo
algo...*/
SNDPGMMSG MSG('Bueno, ya he trabajado bastante, y me +
largo') TOPGMQ(*EXT)
GOTO FIN
BLOQUEO:
SNDPGMMSG MSG('�Ah, pill�n, conque quer�as entrar +
varias veces, eh?!') TOPGMQ(*EXT)
FIN: DLCOBJ OBJ((TSTBLQ *PGM *EXCL))
ENDPGM
Un saludo
Jesus Busquets
Grespania, S.A.
Please respond to [EMAIL PROTECTED]
Sent by: [EMAIL PROTECTED]
To: "'[EMAIL PROTECTED]'" <[EMAIL PROTECTED]>
cc:
Subject: RE: IF ACTIVE .....
Abundando en la soluci�n de alocar/desalocar aqu� tienes un CL que submite
un objeto una sola vez (se debe ejecutar siempre el programa desde aqu�, en
caso contrario puedes tener m�s de una instancia del programa ejecurtandose
simult�neamente)
*************** Beginning of data *************************************
PGM PARM(&NAMELIB &NAMEPGM)
DCL VAR(&NAMEPGM) TYPE(*CHAR) LEN(10) /* Name of +
the program to execute */
DCL VAR(&NAMELIB) TYPE(*CHAR) LEN(10) /* Name of +
the library of the program */
DCL VAR(&LIBPGM) TYPE(*CHAR) LEN(21) /* Name of +
the library + the program */
CHGVAR VAR(&LIBPGM) VALUE(&NAMELIB *TCAT '/' *TCAT +
&NAMEPGM) /* Concatenate lib + pgm */
ALCOBJ OBJ((&NAMELIB/&NAMEPGM *PGM *EXCL)) WAIT(0) +
/* First of all we try to allocate the +
program */
MONMSG MSGID(CPF1002 CPF0952 CPF0939 CPA0701 +
CPF1085 CPF0001) EXEC(GOTO +
CMDLBL(THATSALL)) /* The allocate Fails +
-> The program is running -> That's all +
folks */
DLCOBJ OBJ((&NAMELIB/&NAMEPGM *PGM *EXCL)) /* The +
allocate success, so des-allocate */
SBMJOB CMD(CALL PGM(&NAMELIB/&NAMEPGM)) +
JOB(&NAMEPGM) JOBQ(QNECK) LOG(0 30 +
*NOLIST) LOGCLPGM(*NO) INQMSGRPY(*RQD) +
MSGQ(*NONE) /* The program is not running +
and the program is des-allocated, now you +
can run the program. THE FIRST +
INSTRUCTION OF THE PROGRAM MUST BE +
'ALCOBJ MYSELF *PGM *EXCL'*/
MONMSG MSGID(CPD0028 CPD0170) EXEC(GOTO +
CMDLBL(THATSALL)) /* The Program is not +
in the disk -> That's all folks */
THATSALL: ENDPGM
****************** End of data ****************************************
No es necesario desalocar el objeto al salir pues se desaloca el solo.
Este CL ha funcionado durante bastante tiempo sin ning�n problema.
Saludos. Tono
-----Original Message-----
From: Juan Ram�n Garcia [mailto:[EMAIL PROTECTED]
Sent: lunes 24 de febrero de 2003 10:11
To: [EMAIL PROTECTED]
Subject: RE: IF ACTIVE .....
Hola, en el siguiente enlace tienes un art�culo sobre este tema
http://www.recursos-as400.com/wrk400/150999/maquinista.shtml
Un saludo.
Juanra
----- Original Message -----
From: j_losada losada <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Saturday, February 22, 2003 2:34 AM
Subject: IF ACTIVE .....
> Buenas noches foro,
>
> tal vez alguno de la vieja escuela (sist. 36) me pueda ayudar en el
AS/400,
> necesito hacer una CL que haga en si lo que en RPG II se controlaba con
un
> IF ACTIVE.
> Es decir, tengo un trabajo (ej.: AAAA) que ha de estar permanente activo,
en
> caso de que falle por alguna causa se ha de arrancar automaticamente con
un
> mandato (ej.: XXXX)
> Esto en RPG II sobre sist. 36 se podia controlar con un procedimiento del
> tipo:
>
> INICIO TAG
> IF ACTIVE AAAA GOTO FIN
> XXXX
> FIN TAG
> GOTO INICIO
>
> Mas o menos,... no se si me explico, pues bien, como lo hariais con una
CL?
>
> Gracias a todos
_____________________________________________________
Forum.HELP400 es un servicio m�s de NEWS/400.
� Publicaciones Help400, S.L. - Todos los derechos reservados
http://www.help400.es
_____________________________________________________
Para darte de baja, env�a el mensaje resultante de pulsar
mailto:[EMAIL PROTECTED]
_____________________________________________________
Forum.HELP400 es un servicio m�s de NEWS/400.
� Publicaciones Help400, S.L. - Todos los derechos reservados
http://www.help400.es
_____________________________________________________
Para darte de baja, env�a el mensaje resultante de pulsar
mailto:[EMAIL PROTECTED]
_____________________________________________________
Forum.HELP400 es un servicio m�s de NEWS/400.
� Publicaciones Help400, S.L. - Todos los derechos reservados
http://www.help400.es
_____________________________________________________
Para darte de baja, env�a el mensaje resultante de pulsar
mailto:[EMAIL PROTECTED]
/* ----------------------------------------------------------------- */
/* */
/* TR007C: Controla que se este ejecutando el monitor de */
/* la cola de datos. */
/* */
/* ----------------------------------------------------------------- */
PGM Parm(&DELAY)
DCL VAR(&Delay) TYPE(*Dec) LEN(15 5)
DCL VAR(&JobN) TYPE(*Char) LEN(10) Value('RTVDTQ_CLP')
DCL VAR(&JobName) TYPE(*Char) LEN(26)
DCL VAR(&JobUser) TYPE(*Char) LEN(10)
DCL VAR(&JobNbr) TYPE(*Char) LEN(6) Value(*ALL)
DCL VAR(&UsrSpcN) TYPE(*Char) LEN(10) Value('DTAQ')
DCL VAR(&UsrSpcL) TYPE(*Char) LEN(10) Value('QTEMP')
Dcl Var(&UsrSpc) Type(*Char) Len(20) +
Value('DTAQ QTEMP ')
Dcl Var(&Attr) Type(*Char) Len(10) Value('DTAQ')
Dcl Var(&IniVal) Type(*Char) Len(1) Value(' ')
Dcl Var(&Auth) Type(*Char) Len(10) Value('*LIBCRTAUT')
Dcl Var(&Text) Type(*Char) Len(50) +
Value('Monitor Colas de Datos.')
Dcl Var(&JobL0100) Type(*Char) Len(8) Value('JOBL0100')
Dcl Var(&Status) Type(*Char) Len(10) Value('*ACTIVE')
Dcl Var(&Bin4) Type(*Char) Len(4)
Dcl Var(&NbrJobd) Type(*Dec) Len(8)
Dcl Var(&NbrJobN) Type(*Char) Len(15)
RtvJobA User(&JobUser)
ChgVar Var(&JobName) +
Value(&JobN *Cat +
&JobUser *Cat &JobNbr)
Chkobj Obj(&UsrSpcL/&UsrSpcN) ObjType(*USRSPC)
MonMsg MsgID(CPF9801) Exec(Do)
Call Pgm(QUSCRTUS) Parm(&UsrSpc +
&Attr +
X'00000100' +
&IniVal +
&Auth +
&Text)
EndDo
Bucle: Call Pgm(QUSLJOB) Parm(&UsrSpc +
&JOBL0100 +
&JobName +
&Status)
Call Pgm(QUSRTVUS) Parm(&UsrSpc +
X'00000085' +
X'00000004' +
&Bin4)
ChgVar Var(&NbrJobD) Value(%Binary(&Bin4))
ChgVar Var(&NbrJobN) Value(&nbrjobd)
If Cond(&NbrJobD *EQ 0) Then(Do)
SbmJob Cmd(Call Pgm(RtvDtaQC)) Job(&JobN) +
JobD(&JobN) User(*JobD)
EndDo
DlyJob Dly(&Delay)
Goto CmdLbl(Bucle)
End:
EndPgm