Chinaunix

标题: FYI: 如何確保OBJTYPE:*CTLD的狀態為ACTIVE? [打印本页]

作者: LLee    时间: 2004-10-21 21:25
标题: FYI: 如何確保OBJTYPE:*CTLD的狀態為ACTIVE?
有時會遇到OBJTYPE:*CTLD狀態從ACTIVE轉變成非ACTIVE, 且設定SYSVALCMNRCYLMT亦無法讓狀態自動恢復成ACTIVE. 以下的CLP供大家參考:

1. 首先建立一Physical File,

  1.      CREATE TABLE your_lib_name/CTLDL
  2.        (CTLD CHAR (10 ) NOT NULL, PRIMARY KEY(CTLD))
复制代码


 隨後將要monitor的Controller(s) Name置入此PF中,

  1.      INSERT INTO your_lib_name/CTLDL VALUES('your_ctld')
复制代码


2. 編輯CL source,

  1.      100              PGM
  2.      200
  3.      300              DCL        VAR(&STSCDE) TYPE(*DEC) LEN(5 0)
  4.      400              DCLF       FILE(*LIBL/CTLDL)
  5.      500
  6.      600              MONMSG     MSGID(CPF0000)
  7.      700
  8.      800  NEXT:       RCVF
  9.      900
  10.     1000       /* IF EOF IS DETECTED */
  11.     1100
  12.     1200              MONMSG     MSGID(CPF0864) EXEC(DO)
  13.     1300              DLYJOB     DLY(3600)
  14.     1400              TFRCTL     PGM(*LIBL/CHKCTLD)
  15.     1500              ENDDO
  16.     1600
  17.     1700              RTVCFGSTS  CFGD(&CTLD) CFGTYPE(*CTL) STSCDE(&STSCDE)
  18.     1800
  19.     1900       /* IF OBJ IS NOT FOUND */
  20.     2000
  21.     2100              MONMSG     MSGID(CPF9801) EXEC(GOTO CMDLBL(NEXT))
  22.     2200
  23.     2300       /* CHECK CTLD STATUS IS 'VARY ON PENDING' */
  24.     2400
  25.     2500              IF         COND(&STSCDE = 20) THEN(DO)
  26.     2600              VRYCFG     CFGOBJ(&CTLD) CFGTYPE(*CTL) STATUS(*OFF)
  27.     2700              DLYJOB     DLY(20)
  28.     2800              VRYCFG     CFGOBJ(&CTLD) CFGTYPE(*CTL) STATUS(*ON)
  29.     2900              GOTO       CMDLBL(NEXT)
  30.     3000              ENDDO
  31.     3100
  32.     3200       /* CHECK CTLD STATUS IS 'VARY OFF' */
  33.     3300
  34.     3400              ELSE       CMD(IF COND(&STSCDE = 0) THEN(DO))
  35.     3500              VRYCFG     CFGOBJ(&CTLD) CFGTYPE(*CTL) STATUS(*ON)
  36.     3600              GOTO       CMDLBL(NEXT)
  37.     3700              ENDDO
  38.     3800
  39.     3900        /* OTHER STATUS ARE IGNORED */
  40.     4000
  41.     4100              ELSE       CMD(GOTO CMDLBL(NEXT))
  42.     4200
  43.     4300              ENDPGM
复制代码

3. 編譯 CL source,

  1.      CRTCLPGM PGM(your_lib_name/CHKCTLD) SRCFILE(your_lib_name/QCLSRC)
复制代码


4. 欲監控上述檔案中的 Controller(s) 時, 請執行 CL command:

  1.     SBMJOB CMD(CALL PGM(CHKCTLD)) JOB(CHKCTLSTS)
复制代码


5. 欲確認批次是否成功請執行 CL command:

  1.     WRKACTJOB SBS(QBATCH) -- 畫面類似如下

  2. Opt  Subsystem/Job  User            Type  CPU %  Function        Status
  3.         QBATCH             QSYS           SBS      .0                              DEQW
  4.              CHKCTLSTS   LAURENCE   BCH     .0       DLY-360          DLYW
复制代码


6. 欲結束該程式只要如上述畫面, 在其前面的Opt欄位輸入'4'並按'F4', 於參數'How to end'處填入'*IMMED', 按執行鍵即可!!


PS: 請教一下, 有誰知道如要讓DLYJOB的DLY參數用variable代替要如何做呢?
作者: hanyu    时间: 2004-10-22 08:57
标题: FYI: 如何確保OBJTYPE:*CTLD的狀態為ACTIVE?

  1. PGM        PARM(&V@dlyt)                  
  2. DCL        VAR(&V@dlyt) TYPE(*DEC) LEN(8 0)
  3. DLYJOB     DLY(&V@dlyt)                    
  4. ENDPGM                                    
复制代码

作者: qingzhou    时间: 2004-10-22 09:55
标题: FYI: 如何確保OBJTYPE:*CTLD的狀態為ACTIVE?
感谢楼主提供了解决*CTLD设备inactive时的及时检测并激活的一种办法~~~

原帖由 "hanyu" 发表:

PGM         PARM(&V@dlyt)
                  
DCL         VAR(&V@dlyt) TYPE(*DEC) LEN(8 0)
DLYJOB    DLY(&V@dlyt)   
                 
ENDPGM                              

对此我有3个疑问要请教hanyu:

1。PARM(&V@dlyt)定义变量时为什么还要加@呢,不可以直接使用PARM(&dlyt)吗?

2。“DCL    VAR(&V@dlyt) TYPE(*DEC) LEN(8 0) ”定义变量(&V@dlyt)的类型为数值型—整数类型,如果采用“DCL    VAR(&V@dlyt) TYPE(*CHAR)  LEN(10) ”定义为字符型系统会不会出错?

3。不需要用“CHGVAR &V@dlyt   '3600' ”或者“DCL         VAR(&V@dlyt)  TYPE(*DEC)  LEN(8 0)  VALUE('3600')”对变量进行赋初值吗?
作者: ewmiscc    时间: 2004-10-22 10:36
标题: FYI: 如何確保OBJTYPE:*CTLD的狀態為ACTIVE?
总共4行, 自己测试啦!
作者: xuguopeng    时间: 2004-10-22 11:17
标题: FYI: 如何確保OBJTYPE:*CTLD的狀態為ACTIVE?
原帖由 "qingzhou" 发表:

对此我有3个疑问要请教hanyu:

1。PARM(&V@dlyt)定义变量时为什么还要加@呢,不可以直接使用PARM(&dlyt)吗?

2。“DCL    VAR(&V@dlyt) TYPE(*DEC) LEN(8 0) ”定义变量(&V@dlyt)的类型为数值型—整数类型,?.........


1、定义变量当然是根据个人的习惯了

2、DLYJOB的参数就是数字型的 你给字符型的肯定不行

3、只要把DLY的值做为参数传进来就可以了,可以在SBMJOB的时候给个数值就可以了
作者: qingzhou    时间: 2004-10-22 11:57
标题: FYI: 如何確保OBJTYPE:*CTLD的狀態為ACTIVE?
多谢~~~
“2、DLYJOB的参数就是数字型的 你给字符型的肯定不行 ”,我觉得还是要自己到本地环境测试效果会更好些。

楼主提供的是解决*CTLD设备inactive时的及时检测并激活的一种办法,如果内部LAN存在网络故障,这个PGM作为工具提交到BATCH JOB后还仍然起作用么,有可能出现别的新问题没?

如果成熟的话,我觉得可以提交到本地环境下运行,以减少AS/400网卡被自动关闭的情况的发生次数,增强系统的稳定性。

测试中。。。
作者: LLee    时间: 2004-10-22 12:38
标题: FYI: 如何確保OBJTYPE:*CTLD的狀態為ACTIVE?
如果是要監控LIND的話, 您可自行修改程式碼. 舉Lan Card來說, 可透過RTVCFGSTS去辨別狀態再將其重新activate. 如有bind TCP/IP, 可再加入STRTCP及STRHOSTSVR SERVER(*ALL). 由於Batch Jobs一般皆submit至SBSDBATCH中執行, 所以當Lan Card因線路瞬斷造成LIND status異常, 亦不會影響該CLP程式的運作.

另外, 我嘗試要將DLYJOB的DLY參數以variable代替, 好讓管理者自行決定每一次repeat要delay多久...但都不成功!!

根據online help的說明, DLY的數值最多可輸入數字999999, 所以我declare variable如下:

  1.     PGM        PARM(&SEC)                  
  2.                                        
  3.     DCL        VAR(&SEC) TYPE(*DEC) LEN(6 0)
复制代码


當程式執行時, log會有如下錯誤:

  1.     DLYJOB /* Any parameters not reproduced because of severity of errors. */

  2.     CPD0098 - Decimal value for parameter DLY is not valid.

  3.     CPF0001 - Error found on DLYJOB command.
复制代码


至於CPD0098內容如下:

  1. Message ID . . . . . . :   CPD0098       Severity . . . . . . . :   30        
  2. Message type . . . . . :   Diagnostic                                         
  3. Date sent  . . . . . . :   10/22/04      Time sent  . . . . . . :   12:09:42  
  4.                                                                               
  5. Message . . . . :   Decimal value for parameter DLY is not valid.            
  6. Cause . . . . . :   A decimal value can only contain the digits 0-9 and have a
  7.   plus or minus sign.                                                         
  8. Recovery  . . . :   Enter a value that is allowed, or enter one of the special
  9.   values defined for the parameter. More information on parameters and special
  10.   values can be found in the CL Reference manual.                             
复制代码


甚至將長度如hanyu所說的, 加長為LEN(8 0), 但是情況依舊! 且因此錯誤, 導致系統CPU資源耗損嚴重.

請教: 有解決方法嗎? 還是DLYJOB無法使用variable在CLP中?!

PS: 我試過...將該variable宣告為*CHAR是不行的, log中有說明DLY的參數必須為numeric!!
作者: hanyu    时间: 2004-10-22 14:06
标题: FYI: 如何確保OBJTYPE:*CTLD的狀態為ACTIVE?
CPD0098 应该是把一个字符传给数字型参数了。
作者: hanyu    时间: 2004-10-22 14:22
标题: FYI: 如何確保OBJTYPE:*CTLD的狀態為ACTIVE?
PGM        PARM(&V@dlyt)                    
DCL        VAR(&V@dlyt) TYPE(*DEC) LEN(8 0)
DLYJOB     DLY(&V@dlyt)                    
ENDPGM               

注意参数是数字型的,如果在命令行调用时,要键入16进制,
CALL PGM(dlypgm) PARM(X'F00000100F') 表示停100 秒。
作者: LLee    时间: 2004-10-22 15:54
标题: FYI: 如何確保OBJTYPE:*CTLD的狀態為ACTIVE?
原來是我CALL程式的問題!! 謝謝Mr. hanyu~

CLP程式我修改如下行數為...

  1.      100              PGM        PARM(&SEC)

  2.      350              DCL        VAR(&SEC) TYPE(*DEC) LEN(6 0)

  3.     1400              TFRCTL     PGM(*LIBL/CHKCTLD) PARM(&SEC)
复制代码


執行程式如hanyu所述(以6分鐘為例):

  1.     SBMJOB CMD(CALL PGM(CHKCTLD) PARM(X'F000360F')) JOB(CHKCTLSTS)
复制代码

作者: LLee    时间: 2004-10-27 20:37
标题: FYI: 如何確保OBJTYPE:*CTLD的狀態為ACTIVE?
再次修改程式為可 "自動 (unattended) 判斷 *LIN / *CTL / *DEV 的狀態並保持該狀態為 ACTIVE" 如下:

1. 建立 Table (Physical File):

  1.     CREATE TABLE your_lib_name/CFGL
  2.       (TYPCDE CHAR(1) NOT NULL,
  3.        OBJNME CHAR(10) NOT NULL,
  4.        PRIMARY KEY(TYPCDE, OBJNME)
  5.       )
复制代码


 其中 TYPCDE 的定義為:

  1.     '1' = *LIN ; '2' = *CTL ; '3' = *DEV
复制代码


2. 利用 STRSQL 或 UPDDTA 輸入欲監控的資料, 例如:

  1.     INSERT INTO your_lib_name/CFGL
  2.       VALUES('3', 'QPADEV000B')
复制代码


3. 編輯CL source:

  1.      100              PGM        PARM(&SEC)                     
  2.      200                                                         
  3.      300              DCL        VAR(&SEC) TYPE(*DEC) LEN(6 0)   
  4.      400              DCL        VAR(&OBJTYP) TYPE(*CHAR) LEN(10)
  5.      500              DCL        VAR(&STSCDE) TYPE(*DEC) LEN(5 0)
  6.      600              DCLF       FILE(*LIBL/CFGL)               
  7.      700                                                         
  8.      800              MONMSG     MSGID(CPF0000)                  
  9.      900                                                         
  10.     1000  NEXT:       RCVF                                       
  11.     1100                                                         
  12.     1200       /* IF EOF IS DETECTED */                          
  13.     1300                                                                  
  14.     1400              MONMSG     MSGID(CPF0864) EXEC(DO)                  
  15.     1500              DLYJOB     DLY(&SEC)                                 
  16.     1600              TFRCTL     PGM(*LIBL/CHKCFGSTS) PARM(&SEC)           
  17.     1700              ENDDO                                                
  18.     1800                                                                  
  19.     1900       /* CONVERT 'TYPCDE' TO APPROPRIATE OBJECT TYPE: */         
  20.     2000       /*     '1' = *LIN                                                             */         
  21.     2100       /*     '2' = *CTL                                                            */         
  22.     2200       /*     '3' = *DEV                                                           */         
  23.     2300                                                                  
  24.     2400              IF         COND(&TYPCDE *EQ '3') THEN(CHGVAR +      
  25.     2500                           VAR(&OBJTYP) VALUE('*DEV'))            
  26.     2600              ELSE       CMD(IF COND(&TYPCDE *EQ '2') THEN(CHGVAR +
  27.     2700                           VAR(&OBJTYP) VALUE('*CTL')))            
  28.     2800              ELSE       CMD(IF COND(&TYPCDE *EQ '1') THEN(CHGVAR +
  29.     2900                           VAR(&OBJTYP) VALUE('*LIN')))            
  30.     3000              ELSE       CMD(GOTO CMDLBL(NEXT))                     
  31.     3100                                                                    
  32.     3200       /* RETRIEVE STATUS CODE OF CFGD */                           
  33.     3300                                                                    
  34.     3400              RTVCFGSTS  CFGD(&OBJNME) CFGTYPE(&OBJTYP) STSCDE(&STSCDE)
  35.     3500                                                                    
  36.     3600       /* IF OBJ IS NOT FOUND */                                    
  37.     3700                                                                    
  38.     3800              MONMSG     MSGID(CPF9801) EXEC(GOTO CMDLBL(NEXT))     
  39.     3900                                                                    
  40.     4000       /* CHECK CFGD STATUS IS 'VARY ON PENDING' OR 'RCYPND' */     
  41.     4100                                                                    
  42.     4200              IF         COND(&STSCDE = 20 *OR &STSCDE = 80) THEN(DO)
  43.     4300              VRYCFG     CFGOBJ(&OBJNME) CFGTYPE(&OBJTYP) +         
  44.     4400                           STATUS(*OFF) ASCVRYOFF(*YES)            
  45.     4500              DLYJOB     DLY(20)                                    
  46.     4600              VRYCFG     CFGOBJ(&OBJNME) CFGTYPE(&OBJTYP) STATUS(*ON)
  47.     4700              GOTO       CMDLBL(NEXT)                              
  48.     4800              ENDDO                                                
  49.     4900                                                                    
  50.     5000       /* CHECK CFGD STATUS IS 'VARY OFF' */                        
  51.     5100                                                                    
  52.     5200              ELSE       CMD(IF COND(&STSCDE = 0) THEN(DO))         
  53.     5300              VRYCFG     CFGOBJ(&OBJNME) CFGTYPE(&OBJTYP) STATUS(*ON)
  54.     5400              GOTO       CMDLBL(NEXT)
  55.     5500              ENDDO                  
  56.     5600                                    
  57.     5700        /* OTHER STATUS ARE IGNORED */         
  58.     5800                                               
  59.     5900              ELSE       CMD(GOTO CMDLBL(NEXT))
  60.     6000                                               
  61.     6100              ENDPGM                           
复制代码


4. 編譯程式:

  1.     CRTCLPGM PGM(your_lib_name/CHKCFGSTS) SRCFILE(your_lib_name/QCLSRC)
复制代码


5. 執行程式(迴圈 cycle 以六分鐘為例):

  1.     SBMJOB CMD(CALL PGM(CHKCFGSTS) PARM(X'F000360F')) JOB(CHKCFGSTS)
复制代码

作者: qingzhou    时间: 2004-10-27 22:13
标题: FYI: 如何確保OBJTYPE:*CTLD的狀態為ACTIVE?
很好,有上进心...

对于由于网络不稳定而造成AS/400网卡自动关闭情况,我前几天认真思考了一下,除了用以前很传统的方法:

"首先使用命令ENDTCP结束TCP/IP服务器,再使用命令WRKLIND先VARY OFF埠再VARY ON,最后使用命令STRTCP重新启动TCP/IP服务器。"

解决这个问题外,还可以采用如下更快捷的处理办法:

★在OS/400命令行执行WRKMSG QSYSOPR,如果网卡被自动关闭,它会在QSYSOPR这个系统MSGQ里面显示一条需要用户回答的消息,找到这条信息后执行R=retry即可自动恢复.




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2