星期三, 11月 01, 2023

2002-05-16 如何監控某些 System Job 所產生的錯誤訊息?(利用 MSGD 參數 DFTPGM)


如何監控某些 System Job 所產生的錯誤訊息?(利用 MSGD 參數 DFTPGM)

某些 System Job 於執行中會產生錯誤訊息, 若 System Job 程式本身將該錯誤訊息忽略, 
則該錯誤訊息依錯誤嚴重性, System Job 程式有可能將該錯誤訊息傳送至 QSYSOPR Message
Queue(訊息佇列), 或僅將該錯誤訊息送至該 System Job 本身的 Job Log.

若錯誤訊息傳送至 QSYSOPR 則利用 DSPMSG QSYSOPR 命令較容易查知系統有何異樣, 
可利用前期電子報"如何自動監控 QSYSOPR message queue 內的硬體重要 Attention 訊息?" 來達到及時監控.

若錯誤訊息僅送至 System Job 本身的 Job Log, 有三種情況產生:

1. 錯誤訊息送至 System Job 本身的 Job Log 後, 該 System Job 不正常中斷, 並自動產生
報表 QPJOBLOG. 因為程式中斷, 且產生報表 QPJOBLOG, 系統人員需瀏覽報表以找出錯誤
原因,並記下該錯誤訊息代碼 MSGID.

2. 錯誤訊息送至 System Job 本身的 Job Log 後, 該 System Job 不正常中斷, 於 WRKACTJOB
畫面中顯示狀態 MSGW 等待回覆訊息.因為狀態 MSGW 等待回覆訊息, 系統人員需檢視該
System Job 的 Job Log, 以找出錯誤原因,並記下該錯誤訊息代碼 MSGID, 再回覆訊息.

3. 由於 System Job 程式中直接監控該錯誤訊息,所以錯誤訊息僅送至 System Job 本身的 Job 
Log , 且該 System Job 程式繼續執行. 這種情形是較難的, 因為使用者只說明他的作業不能做,
且系統並沒有 Message Queue 可供查核錯誤訊息, 此時僅能執行命令
 WRKOBJLCK OBJ(userprofile) OBJTYPE(*USRPRF)
顯示該使用者所有的 Job, 從中檢視每個 Job 的 Job Log, 以找出錯誤原因,並記下該錯誤訊息代碼 MSGID.

以上三種情況對於系統管理人員或使用者均不會知道系統發生了什麼事, 尤其是系統管理人員
若未即時發現問題, 就只能等使用者反映問題,再行處理.

以上所說的 System Job 最常發生在 Client Access Host Server 的 Server Job 上, 
事實上系統人員根本無法預知 System Job 會有何種錯誤訊息發生, 基本上只能從所有已發生
的錯誤訊息中學習, 避免同樣的錯誤再次發生或同樣的錯誤發生時系統能即時通知相關人員處理.

那要如何於同樣的錯誤發生時系統能即時通知相關人員呢?
(為何允許同樣的錯誤再發生呢? 因為 System Job 系統程式相關性很大, 且一般應用軟體設定
若不周全或跨系統時, 則會導致相同的錯誤發生)

所以錯誤訊息的監控基本上均架構在訊息代碼 MSGID 上, AS/400(iSeries) 上訊息代碼
MSGD 中參數 DFTPGM 可設定為當該訊息產生時, 馬上執行 DFTPGM 中所指定的程式,即可即
時處理相關作業, 如紀錄使用者當時的訊息獲通知相關人員處理.


File  : QCLSRC
Member: MSGDFTPGMC
Type  : CLP
Usage : CRTCLPGM MSGDFTPGMC


/* MONITOR CPF9006 CHGMSGD DFTPGM(MSGDFTPGMC) */
/* BECAUSE THE MESSAGE NOT SENT TO QSYSOPR UNDER SYSTEM BATCH JOB    */
/* QPWFSERVSO WHEN USER USE NEIGHBERHOOD ON CA 3.2.                  */
/* AND OPERATOR NEVER KNOW WHO GOT THE ERROR OR SOMEONE NO AUTHORIZE */
/* ACCESS SYSTEM RESOURCE.                                           */
/* THE PROGRAM WILL SEND MESSAGE TO QSYSOPR                          */
/* BUT THE BEST WAY IS SETUP THE USER DIRECTORY AND USERPROFILE      */
/* CREATE AT THE SAME TIME.                                          */
/* Reference : CL Command ADDMSGD                                    */


             PGM  (&PARM1 &PARM2)

             DCL        VAR(&PARM1) TYPE(*CHAR) LEN(277)
             DCL        VAR(&PARM2) TYPE(*CHAR) LEN(4)   /* MSG KEY */
             DCL        VAR(&PGMNAME) TYPE(*CHAR) LEN(10)
             DCL        VAR(&MODNAME) TYPE(*CHAR) LEN(10)
             DCL        VAR(&ILETYPE) TYPE(*CHAR) LEN(1)
             DCL        VAR(&MSGDTA) TYPE(*CHAR) LEN(20)

             CHGVAR &PGMNAME %SST(&PARM1   1 10)
             CHGVAR &MODNAME %SST(&PARM1  11 10)
             CHGVAR &ILETYPE %SST(&PARM1 277  1)

             RCVMSG     MSGKEY(&PARM2) RMV(*NO) MSGDTA(&MSGDTA)

             SNDPGMMSG  MSGID(CPF9006) MSGF(QCPFMSG) MSGDTA(&MSGDTA) +
                          TOPGMQ(*EXT) TOMSGQ(*SYSOPR)

             ENDPGM

File  : QCLSRC
Member: MSGDFTPGMC
Type  : CLP
Usage : CRTCLPGM MSGDFTPGMC
        CHGMSGD MSGID(CPF9006) MSGF(QCPFMSG) DFTPGM(your library/MSGDFTPGMC)
        WRKDIRE to confirm calling test program user profile not in directory
        Test program: CALL MSGDFTPGMT, then the CPF9006 message will send to QSYSOPR


/* FOR TEST THE MSGDFTPGMC MONITOR CPF9006                   */
/* CALL THE PROGRAM USE A USER NOT IN DIRECTORY ENTRY        */
/*                                                           */
/* THEN YOU WILL SEE A MESSAGE ON QSYSOPR                    */
             PGM

             SNDNETF    FILE(your library/QCLSRC) TOUSRID((TEST SYSTEM)) +
                          MBR(MSGDFTPGMC)

             ENDPGM






沒有留言: