Su altri sistemi si va a cercare i log in una cartella. Qui i messaggi finiscono in code di messaggi: ogni job ne ha una, ogni utente ne ha una, e il sistema ne ha alcune che riguardano tutti.
Il vantaggio è che ogni messaggio sa da dove viene: quale programma, quale job. Il prezzo è che bisogna sapere in quale coda guardare.
Le code che contano
- QSYSOPR: la coda dell'operatore di sistema. Ci arriva ciò che il sistema vuole far sapere a chi conduce la macchina.
- QSYSMSG: una coda facoltativa per un elenco preciso di messaggi gravi. Non esiste finché non la si crea in QSYS.
- La coda dell'utente: una per profilo, dove arrivano i messaggi indirizzati a quella persona.
- La coda del job: da cui si ricava il registro del singolo lavoro, il job log.
DSPMSG MSGQ(QSYSOPR)
WRKMSGQ
QSYSMSG
Quando QSYSMSG esiste e non è danneggiata, IBM manda lì alcuni messaggi gravi: certi
al posto di QSYSOPR, certi anche a QSYSOPR. Uno degli esempi della documentazione è
CPF0907, la condizione di spazio su disco grave. Si crea così, e da quel momento il
sistema comincia a usarla:
CRTMSGQ MSGQ(QSYS/QSYSMSG) TEXT('Messaggi gravi del sistema')
Avvertenza
proprio perché alcuni messaggi vanno lì invece che in QSYSOPR, chi crea QSYSMSG deve guardarla. IBM lo dice chiaro: non va creata se non si vuole ricevere quei messaggi. Il modo previsto è un programma che la legge come programma di gestione dei messaggi in arrivo, e rimanda altrove quelli che non richiedono un'azione.
Messaggi che aspettano una risposta
Alcuni messaggi sono di richiesta: il job che li ha mandati si ferma finché qualcuno non
risponde. Si vedono in DSPMSG e si risponde sulla riga; le risposte accettate le dice il
messaggio stesso.
Chi risponde quando nessuno guarda lo decide l'attributo INQMSGRPY del job, che si dà
nella descrizione di job o con CHGJOB:
| Valore | Che cosa succede |
|---|---|
*RQD |
serve una risposta: il job aspetta |
*DFT |
risponde il sistema con la risposta predefinita del messaggio |
*SYSRPYL |
il sistema cerca il messaggio nell'elenco delle risposte (ADDRPYLE); se non lo trova, serve una risposta |
*SYSRPYL è la strada più controllata, perché dice quale risposta dare a quale messaggio e
lascia in attesa tutti gli altri. ADDRPYLE è distribuito con il pubblico a *EXCLUDE: lo
usa QPGMR, o chi ha ricevuto *USE sul comando.
ADDRPYLE SEQNBR(10) MSGID(RPG1241) RPY(G)
WRKRPYLE
È il primo esempio della pagina IBM del comando: a ogni RPG1241 (record non trovato)
mandato da un job che usa l'elenco, il sistema risponde G senza fermarsi. Messaggio e
risposta vanno scelti sul proprio caso, leggendo il secondo livello del messaggio.
Consiglio
una risposta automatica a tutto non è prudente: un messaggio a cui si risponde da soli è un messaggio che nessuno legge più.
Il job log
Ogni job scrive il proprio registro. Finché il job è vivo:
DSPJOBLOG JOB(123456/MROSSI/CHIUSURA)
In SQL, con una riga per messaggio, c'è QSYS2.JOBLOG_INFO. Il primo messaggio grave di un
job:
SELECT MESSAGE_TIMESTAMP, MESSAGE_ID, SEVERITY, MESSAGE_TEXT, FROM_PROGRAM
FROM TABLE(QSYS2.JOBLOG_INFO('123456/MROSSI/CHIUSURA'))
WHERE SEVERITY >= 30
ORDER BY ORDINAL_POSITION
FETCH FIRST 1 ROW ONLY
ORDINAL_POSITION numera i messaggi nell'ordine in cui sono arrivati. Serve il diritto speciale *JOBCTL, oppure essere l'utente del job.
Quando il job è finito, il registro diventa un file di spool, QPJOBLOG, nella coda di
uscita del job: per questo i job log si cercano in WRKSPLF. In SQL lo legge
SYSTOOLS.SPOOLED_FILE_DATA, che IBM dà come esempio costruito su CPYSPLF:
SELECT SPOOLED_DATA
FROM TABLE(SYSTOOLS.SPOOLED_FILE_DATA(
JOB_NAME => '123456/MROSSI/CHIUSURA',
SPOOLED_FILE_NAME => 'QPJOBLOG'))
WHERE SPOOLED_DATA LIKE '%CPF%'
Quanto scrive, e quando non lo scrive
Il parametro LOG della descrizione di job ha tre parti: livello (0-4), gravità minima, e
testo. Il valore di serie di CRTJOBD è LOG(4 0 *NOLIST).
| Terza parte | Che cosa produce |
|---|---|
*NOLIST |
se il job finisce bene, nessun job log; se finisce male (codice di fine 20 o più), un job log con testo e spiegazione |
*MSG |
solo il testo dei messaggi |
*SECLVL |
il testo e il secondo livello, con causa e rimedio |
Per questo un lavoro andato a buon fine spesso non lascia nessun job log: non è un guasto,
è *NOLIST. Chi lo vuole sempre mette *SECLVL nella descrizione di job.
C'è poi un secondo parametro, LOGOUTPUT, che decide chi produce la stampa. Il valore
viene dal valore di sistema QLOGOUTPUT, che di serie la fa produrre al job stesso
(*JOBEND); IBM consiglia *JOBLOGSVR, il server dei job log. Con *PND la stampa non si
produce: il job log resta in sospeso, si vede con DSPJOBLOG e si stampa dopo con
CHGJOB. IBM lo presenta come modo di risparmiare processore e spazio sui job log inutili.
Avvertenza
i job log e le stampe che non servono più vanno cancellati. Di serie lo fa periodicamente Operational Assistant, che toglie anche i job log in sospeso.
Leggere un errore
Ogni messaggio ha un codice, come CPF9801 o MCH3601, e il codice ha una
spiegazione a due livelli: il testo breve, e il secondo livello che dice causa e rimedio.
In DSPJOBLOG si porta il cursore sulla riga e si preme F1.
Le tre lettere iniziali dicono da dove viene. Alcuni prefissi dalla documentazione di
ADDMSGD:
| Prefisso | Che cosa è |
|---|---|
CPF |
sistema operativo, fine anomala |
CPD |
sistema operativo, diagnosi |
CPI |
sistema operativo, informazione |
CPA |
sistema operativo, serve un intervento dell'operatore |
MCH |
interfaccia macchina |
I messaggi CPF, MCH, RNQ e SQL hanno una pagina per codice in Errori.
Consiglio
in un job log lungo, l'ultimo messaggio di solito descrive la fine, non la causa. Conviene partire dal primo messaggio grave, come fa la query qui sopra, e leggere in avanti da lì.
Fonti
- IBM: QSYSMSG message queue
- IBM: Creating message queue QSYSMSG for severe messages
- IBM: Create Job Description (CRTJOBD)
- IBM: Add Reply List Entry (ADDRPYLE)
- IBM: JOBLOG_INFO table function
- IBM: SPOOLED_FILE_DATA table function
- IBM: Produce printer output for job log (QLOGOUTPUT)
- IBM: Add Message Description (ADDMSGD)
Commenti
Nessun commento ancora. Sii il primo a commentare!
Devi avere un account per commentare. Accedi · Registrati