PDA

View Full Version : jobstatus überprüfen



Seiten : [1] 2

Q_SECOFR
28-12-14, 17:36
hallo @all,
hat jemand eine idee / lösung für folgendes: ich habe einen Job submitted, dieser läuft in einem extra dafür geschaffenes SBS. der besagte Job läuft alle 55 sekunden. nun kann es passieren, dass dieser job aus diversen gründen (SQLxxx, CPFxxxx, MCHxxxx) hängen bleibt. hat jemand ein CL (bitte nur CL, kein RPG- o. ä. kenner!!!), mit dem ich den job überwachen kann, und das evtl. eine MSG an den user sendet, der den job gecallt hat?

ich habe im CL, das den job callt, die MSGQ mit einer variabel auf den user gestellt, der den job callt - nicht schön, weil nur die MSG "...antwort auf nachricht in Warteschlange QSYSOPR erwartet..." ausgegeben wird. ich hätte gerne so 'was, wie "ACHTUNG: MYJOB hat gerade einen Fehler gemeldet, bitte Job prüfen lassen!" durch [ENTER] würde dann sofort in WRKACTJOB verzweigt.

kann jemand helfen? DANKESCHÖN!!!

KingofKning
28-12-14, 18:52
Tja wenn Du nur CL willst, gibt es die Möglichkeit den wrkactjob in eine Spooldatei zu drucken und diese auf msgw durchzulesen.

Ist am Anfang ne Menge Arbeit da Du ja bei Null anfängst hatten wir aber in meiner alten Firma auch so gelöst.

Habe leider die Sourcen nicht mehr.

GG

Q_SECOFR
28-12-14, 19:10
ja, in die Richtung habe ich auch schon gedacht: WRKSTJOB outpunt *PRINT, aber wie lese ich dann das erzeugte spoolfile mit einem CL durch?

holgerscherer
28-12-14, 19:11
kann jemand helfen? DANKESCHÖN!!!

Jede MSG* sollte man abfangen können. Ansonsten musst Du Deinen Überwachungsjob auch noch überwachen, das kann auf Dauer etwas unübersichtlich sein. Wenn der Job alle 55 Sekunden (?) laufen soll und eine kurze Angelegenheit erledigen, dann wäre es vielleicht angebrachter, mit Data Queues oder Prestarted Jobs zu arbeiten, je nach Anforderung.

Übrigens, was ist eine AS/500? ;-)

-h

Q_SECOFR
28-12-14, 19:19
oje, @holgerscherer..., vielen dank, habe das gleich geändert...

der job prüft in einer datei mit vielen SQLs feldinhalte ab. je nach regel, ändert er diese dann ab. in der datei darf es, z. b., nur einmal eine beleg-nr. geben. wenn nun aber weihnachten auf Ostern fällt, gleichzeitig vollmond ist, dann "entstehen" aber trotzdem zwei identische beleg-nr., folge: der job schmierrt mit MSGW ab! das möchte ich nun ja nicht mit MONMSG abfangen, ich will das ja wissen, nur möchte ich eben nicht immer in die jobs 'reinschauen, ob evtl. gerade etwas brennt...

KingofKning
28-12-14, 19:47
Du kannst den Spool in eine Datei kopieren und diese Datei in CL durchlesen.

Für das Copy vom Spoolfile fragst du mit der Option *last an welche Datei du kopieren willst.

Also etwa so:


wrkactjob *print
cpyspoolfile *last -> tmp/dat1
read dat1
wenn substring(string, 10 , 15) = job & substring(string(20,15) = "MSGW" dann haue Roten Knopf
ansonsten lies weiter.

GG

Habe mal gerade auf meiner Kiste nach gesehen:

CRTPF FILE(QTEMP/DAT01) RCDLEN(120)
CPYSPLF FILE(QPDSPAJB) TOFILE(QTEMP/DAT01) SPLNBR(*LAST)

Dann hast Du die Daten in der Datei.

Q_SECOFR
28-12-14, 20:11
perfekt, KINGOFKNING, danke! das hilft schon 'mal sehr weiter, aber: wie lese ich dann die datei im CL? kannst du mir dafür auch noch den code geben? wäre klasse!

malzusrex
28-12-14, 20:24
Mahlzeit,

ich hatte mir da mal gebastelt mit API.
Der Job läuft im CTL und prüft aller 5 Minuten o ein JOB im MSGW hängt und eine Mail raus wirft, wenn ein Job eben im MSGW ist.
Ich suche das mal raus. Eventuell kannst du damit was anfangen.

Gruß
Ronald

malzusrex
28-12-14, 20:38
* ************************************************** **********************
* Programm erstellen mit:
* CRTRPGMOD MODULE(DIPOBJ/LISTMSGW) SRCFILE(DIPSRVPGM/QRPGLESRC) dbgview(*all)
* CRTPGM PGM(DIPOBJ/LISTMSGW) BNDSRVPGM(DIPSRVPGM/#USRSPAPI)
* ************************************************** **********************
h bnddir('QC2LE')

fgrobjdp uf a e disk

D* UserSpace für JobListe
D UserOK S 1A
D UserSpace S 20A INZ('QUSLJOB QTEMP ')
D UsrSpcExtA S 10A INZ('PROD')
D UsrSpcText S 50A INZ('JobListe ')
D LstFormat S 8A INZ('JOBL0200')
D I_O_Err s *

D LstFormat1 S 8A INZ('JOBI0200')
D NbrEntries s 10U 0
D Count s 10U 0

d
D JOBL0200 ds
D $JobName 1 10
D $UserName 11 20
D $Jobnummer 21 26
D $JobIdent 27 42
D $Status 43 52
D $JobTyp 53 53
D $JobTyp1 54 54
D $Reserved 55 56
D $JobInfoStat 57 57
D $Reserved1 58 60
d
D JOBI0200 ds
d $Job_Type 61 61
d $Funktion 98 107
D $Act_Job_St 108 111
d $jobi0200 1 256
d
d $jobi0200Len s 4B 0 Inz(256)
d
d
d Job_Name2 s 26 Inz('*INT ')
d Job_Name1 s 26 Inz('*INT ')
d Job_Name s 26 Inz('*ALL *ALL *ALL ')
d Job_Status s 10 Inz('*ACTIVE ')
d
D sk c ''''
d Fehler_msg s 100
d Empfaenger s 30
d Befehl s 800
d MSG_Text s 256
d
d von c x'00'
d nach c x'40'

* Prototype Lists
D/COPY dipsrvpgm/QRPGLESRC,FUSPCP

D System pr 10i 0 extproc('system')
D * value options(*string)
D

c Eval UserOK = CrtUsrSpc(UserSpace :
c UsrSpcExtA :
c UsrSpcText )
c
c Call 'QUSLJOB'
c Parm UserSpace
c Parm LstFormat
c Parm Job_Name
c Parm Job_Status
c Parm I_O_Err
c
c
c Eval NbrEntries = GetNumEnt(UserSpace)
c
c For Count = 1 to NbrEntries
c Eval JOBL0200 = GetSpcEnt(UserSpace : Count)
c ExSr Work
c EndFor
c
c Eval UserOK = DltUsrSpc(UserSpace)
c
c Eval *InLr = *On


c Work BegSr
c*
c Call (e) 'QUSRJOBI'
c Parm JOBI0200
c Parm $jobi0200Len
c Parm LstFormat1
c Parm Job_Name1
c Parm $JobIdent
c
c If $Act_Job_St = 'MSGW' and
c $Job_Type <> 'W'
c ExSr SR_Fehler
c EndIf
c*
c EndSr

c SR_Fehler BegSr
c*
c Eval Job_Name2 = $Jobname + $UserName +
c $JobNummer
c Call 'MSGINFO'
c Parm Job_Name2
c Parm MSG_Text
c
c Eval Fehler_msg ='MSGW - Job: ' +
c $Jobname + $UserName +
c $JobNummer + ' ' + $Funktion
c
c Eval MSG_Text = %XLate( von:nach:msg_text )
c If pm_Empf1 <> *Blanks
c Eval Empfaenger = pm_Empf1
c ExSr SR_Email
c EndIf
c If pm_Empf2 <> *Blanks
c Eval Empfaenger = pm_Empf2
c ExSr SR_Email
c EndIf
c If pm_Empf3 <> *Blanks
c Eval Empfaenger = pm_Empf3
c ExSr SR_Email
c EndIf
c If pm_Empf4 <> *Blanks
c Eval Empfaenger = pm_Empf4
c ExSr SR_Email
c EndIf
c If pm_Empf5 <> *Blanks
c Eval Empfaenger = pm_Empf5
c ExSr SR_Email
c EndIf
c*
c EndSr

c SR_Email BegSr
c*
c Eval Befehl = 'cl_sndm ' +
c sk + 'AS400@GTC10.de' + sk + ' ' +
c sk + %Trim(Empfaenger) + sk + ' ' +
c sk + %Trim( MSG_Text ) + sk + ' ' +
c sk + %Trim(Fehler_msg) + sk
c CallP System( befehl )
c*
c EndSr
c *InzSr BegSr
c*
c *Entry PList
c Parm PM_Empf1 30
c Parm PM_Empf2 30
c Parm PM_Empf3 30
c Parm PM_Empf4 30
c Parm PM_Empf5 30
c*
c EndSr





* ************************************************** **********************
* Service - PGM erstellen mit:
* CRTRPGMOD MODULE(DIPSRVPGM/#USRSPAPI) SRCFILE(DIPSRVPGM/QRPGLESRC)
* CRTSRVPGM SRVPGM(DIPSRVPGM/#USRSPAPI) EXPORT(*ALL)
* ************************************************** **********************
*
************************************************** ************************
*
* Program Name: FunctUsp
* Program Title: User Space Function Procedures
* Author:
* Origin Date: 1/23/1998
* Revisions:
*
************************************************** ************************
H NOMAIN

* Prototype Lists
D/COPY dipsrvpgm/QRPGLESRC,FUSPCp

* Generic Error Structure
D/COPY dipsrvpgm/QRPGLESRC,QUSEC
* User Space Generic Structure
D/COPY dipsrvpgm/QRPGLESRC,QUSGEN


D DS_Error DS
D Bytpv 1 4b 0 inz(100)
D Bytav 5 8b 0 inz(0)
D MSgid 9 15
D Resvd 16 16
D Exdta 17 256
D Exdta52 17 67

************************************************** ************************
*
* Procedure Name: CrtUsrSpc
*
************************************************** ************************
P CrtUsrSpc B EXPORT
D CrtUsrSpc PI 1A
D UsrSpcName 20A VALUE
D UsrSpcExtA 10A VALUE
D UsrSpcText 50A VALUE


* Local Variables

* User Space API Fields
D SpaceName S 20A
D SpaceSize S 9B 0 INZ(8388608)
D SpaceInit S 1A INZ(x'00')
D SpaceExtA S 10A
D SpaceAut S 10A INZ('*ALL')
D SpaceText S 50A
D SpaceRepl S 10A INZ('*YES')
D SpaceDom S 10A INZ('*USER')

* Set error code structure to use basic feedback
C***** EVAL QUSBPRV = 16

* Set up imported variables
C EVAL SpaceName = UsrSpcName
C EVAL SpaceExtA = UsrSpcExtA
C EVAL SpaceText = UsrSpcText

C CALL 'QUSCRTUS'
C PARM SpaceName
C PARM SpaceExtA
C PARM SpaceSize
C PARM SpaceInit
C PARM SpaceAut
C PARM SpaceText
C PARM SpaceRepl
C PARM DS_Error
C PARM SpaceDom

C SELECT
C WHEN Bytav = 0
C RETURN 'Y'
C WHEN Bytav <> 0
C Bytav DSPLY 'OS400'
C MSgid DSPLY 'OS400'
C Exdta52 DSPLY 'OS400'
C RETURN 'N'
C ENDSL

P CrtUsrSpc E

************************************************** ************************
*
* Procedure Name: GetUsrSpcP
*
************************************************** ************************
P GetUsrSpcP B EXPORT
D GetUsrSpcP PI *
D UsrSpcName 20A VALUE

D SpaceName S 20A
D SpacePoint S *

* Set error code structure to use basic feedback
C EVAL QUSBPRV = 16

* Set up imported variables
C EVAL SpaceName = UsrSpcName

* Get the pointer for the user space
C CALL 'QUSPTRUS'
C PARM SpaceName
C PARM SpacePoint
C PARM QUSEC

C RETURN SpacePoint

P GetUsrSpcP E

************************************************** ************************
*
* Procedure Name: GetNumEnt
*
************************************************** ************************
P GetNumEnt B EXPORT
D GetNumEnt PI 9B 0
D UsrSpcName 20A VALUE

* Local Variables
D UsrSpcPntr S *
D BigField S 32767A BASED(UsrSpcPntr)

* Get the pointer for the user space
C EVAL UsrSpcPntr = GetUsrSpcP(UsrSpcName)

* Move the based on pointer to
C MOVEL BigField QUSH0100

* Return number of list entries
C RETURN QUSNBRLE

P GetNumEnt E

************************************************** ************************
*
* Procedure Name: GetSpcEnt
*
************************************************** ************************
P GetSpcEnt B EXPORT
D GetSpcEnt PI 32767A
D UsrSpcName 20A VALUE
D EntNumber 9B 0 VALUE

* Local Variables
D UsrSpcPntr S *
D ListPointr S *
D BigField S 32767A BASED(ListPointr)
D BigFldOut S 32767A

* Get the pointer for the user space
C EVAL UsrSpcPntr = GetUsrSpcP(UsrSpcName)

* Move the based on pointer to get header information
C EVAL ListPointr = UsrSpcPntr
C MOVEL BigField QUSH0100

* Check to see if entry requested is <= user space number entries
* If not, return a blank field
C IF EntNumber > QUSNBRLE
C EVAL BigFldOut = *BLANKS
C RETURN BigFldOut
C ENDIF

* Return specific list entry
C EVAL EntNumber = EntNumber - 1
C EVAL ListPointr = ListPointr + QUSOLD +
C (QUSSEE * EntNumber)
C EVAL BigFldOut = %SUBST(BigField:1:QUSSEE)

C RETURN BigFldOut

P GetSpcEnt E
************************************************** ************************
*
* Procedure Name: DltUsrSpc
*
************************************************** ************************
P DltUsrSpc B EXPORT
D DltUsrSpc PI 1A
D UsrSpcName 20A VALUE

* Local Variables

* User Space API Fields
D SpaceName S 20A

* Set error code structure to use basic feedback
C EVAL QUSBPRV = 16

* Set up imported variables
C EVAL SpaceName = UsrSpcName

C CALL 'QUSDLTUS'
C PARM SpaceName
C PARM QUSEC

C SELECT
C WHEN QUSBAVL = 0
C RETURN 'Y'
C WHEN QUSBAVL <> 0
C RETURN 'N'
C ENDSL

P DltUsrSpc E







/IF NOT DEFINED(FUSPCP)
************************************************** ************************
*
* Program Name: FunctUSPcp
* Program Title: Copy Member for User Space Prototypes
* Origin Date: 10/30/97
* Author:
* Revisions:
*
************************************************** ************************

* Prototype for CrtUsrSpc procedure (Create User Space)
D CrtUsrSpc PR 1A
D UsrSpcName 20A VALUE
D UsrSpcExtA 10A VALUE
D UsrSpcText 50A VALUE

* Prototype for GetUsrSpcP procedure (Get User Space Pointer)
D GetUsrSpcP PR *
D UsrSpcName 20A VALUE

* Prototype for GetNumEnt procedure (Get Number of Entries in the User Space)
D GetNumEnt PR 9B 0
D UsrSpcName 20A VALUE

* Prototype for GetSpcEnt procedure (Get Specific Entry in the User Space)
D GetSpcEnt PR 32767A
D UsrSpcName 20A VALUE
D EntNumber 9B 0 VALUE

* Prototype for DltUsrSpc procedure (Delete User Space)
D DltUsrSpc PR 1A
D UsrSpcName 20A VALUE


/DEFINE FUSPCP
/ENDIF






* ================================================== ================
* = Program....... CBX007T =
* = Description... Sample code using procedure GetLogMsg =
* = =
* = CrtRPGMod Module( MSGINFO ) srcfile(dipsrvpgm/qrpglesrc) dbgview(*all)
* = CrtPgm Pgm( MSGINFO ) Module( MSGINFO ) BndSrvPgm( CBX007 )=
* ================================================== ================

H Option( *SrcStmt )

*-- API error data structure
D ApiError Ds
D AeBytPrv 10i 0 Inz( %Size( ApiError ))
D AeBytAvl 10i 0
D AeExcpId 7a
D 1a
D AeExcpDta 128a

*-- Get joblog message prototype
D GetLogMsg Pr 512a Varying
D PxJobId 26a Const
D PxMsgOpt 6a Const
D PxMsgKey 4a Options( *NoPass )

*-- Data definitions
D JobId s 26a
D Msg s 256a
D MsgKey s 4a

C *Entry PList
c Parm JobId
c Parm Msg

C Eval Msg = GetLogMsg( JobId
C : '*LAST'
c
C )

C Eval *InLr = *On


Das CL dazu


pgm

dcl &Empaenger1 *char 30
dcl &Empaenger2 *char 30
dcl &Empaenger3 *char 30
dcl &Empaenger4 *char 30
dcl &Empaenger5 *char 30

chgvar &Empaenger1 'Name@irgendwas.de'
/*chgvar &Empaenger2 'Name2@irgendwas.de */

START:
call listmsgw (&Empaenger1 +
&Empaenger2 +
&Empaenger3 +
&Empaenger4 +
&Empaenger5 )

dlyjob dly(300)
goto START

endpgm


Bei Frage kurze PN an mich

Gruß
Ronald

malzusrex
28-12-14, 21:34
Wenn nur im CL--> hier eine Anregung.


PGM

DCLF DAT01 /* WOrkFile für den Copy-Splf */
DCL &Job *char 10 /* Job-Name */
DCL &User *char 10 /* Benutzer */
DCL &Job_Status *char 10 /* Job-Status */

START:
/* Work-File erstellen + löschen*/
CRTPF FILE(QTEMP/DAT01) RCDLEN(150)
MONMSG CPF0000
CLRPFM QTEMP/DAT01
MONMSG CPF0000

/* Jobliste in Spool ausgeben und in Datei kopieren */
wrkactjob *print
CPYSPLF FILE(QPDSPAJB) TOFILE(QTEMP/DAT01) SPLNBR(*LAST)

/* Datei lesen bis */
LOOP: RCVF RCDFMT(DAT01)
MONMSG MSGID(CPF0864) EXEC(GOTO CMDLBL(WEITER)) /* bis zum Ende lesen */

/* Infos aus Zeile holen */
CHGVAR VAR(&JOB_STATUS) VALUE(%SST(&DAT01 116 4))
CHGVAR VAR(&JOB) VALUE(%SST(&DAT01 4 10))
CHGVAR VAR(&User) VALUE(%SST(&DAT01 17 10))

IF COND(&JOB_STATUS *EQ 'MSGW') THEN(DO)
/* Hier SNDUSRMSG oder so einbauen */
EndDO

goto loop
WEITER:
dlyjob dly(300)
goto START

ENDPGM


Um das CL zu erstellen musst du dir Datei DAT01 erst einmal erstellen
CRTPF FILE(QTEMP/DAT01) RCDLEN(150)
Dann das CL interaktiv umwandeln.

Gruß
Ronald