中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 操作系统 > IBM Server
FYI: 如何確保OBJTYPE:*CTLD的狀態為ACTIVE?
作者:未知 时间:2005-09-13 15:47 出处:ChinaUnix.net 责编:chinaitpower
              摘要:FYI: 如何確保OBJTYPE:*CTLD的狀態為ACTIVE?

有時會遇到OBJTYPE:*CTLD狀態從ACTIVE轉變成非ACTIVE, 且設定SYSVAL:QCMNRCYLMT亦無法讓狀態自動恢復成ACTIVE. 以下的CLP供大家參考:

1. 首先建立一Physical File, 

[code:1:fcaf9b6af1]     CREATE TABLE your_lib_name/CTLDL
       (CTLD CHAR (10 ) NOT NULL, PRIMARY KEY(CTLD))[/code:1:fcaf9b6af1]

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

[code:1:fcaf9b6af1]     INSERT INTO your_lib_name/CTLDL VALUES('your_ctld')[/code:1:fcaf9b6af1]

2. 編輯CL source,

[code:1:fcaf9b6af1]     100              PGM
     200
     300              DCL        VAR(&STSCDE) TYPE(*DEC) LEN(5 0)
     400              DCLF       FILE(*LIBL/CTLDL)
     500
     600              MONMSG     MSGID(CPF0000)
     700
     800  NEXT:       RCVF
     900
    1000       /* IF EOF IS DETECTED */
    1100
    1200              MONMSG     MSGID(CPF0864) EXEC(DO)
    1300              DLYJOB     DLY(3600)
    1400              TFRCTL     PGM(*LIBL/CHKCTLD)
    1500              ENDDO
    1600
    1700              RTVCFGSTS  CFGD(&CTLD) CFGTYPE(*CTL) STSCDE(&STSCDE)
    1800
    1900       /* IF OBJ IS NOT FOUND */
    2000
    2100              MONMSG     MSGID(CPF9801) EXEC(GOTO CMDLBL(NEXT))
    2200
    2300       /* CHECK CTLD STATUS IS 'VARY ON PENDING' */
    2400
    2500              IF         COND(&STSCDE = 20) THEN(DO)
    2600              VRYCFG     CFGOBJ(&CTLD) CFGTYPE(*CTL) STATUS(*OFF)
    2700              DLYJOB     DLY(20)
    2800              VRYCFG     CFGOBJ(&CTLD) CFGTYPE(*CTL) STATUS(*ON)
    2900              GOTO       CMDLBL(NEXT)
    3000              ENDDO
    3100
    3200       /* CHECK CTLD STATUS IS 'VARY OFF' */
    3300
    3400              ELSE       CMD(IF COND(&STSCDE = 0) THEN(DO))
    3500              VRYCFG     CFGOBJ(&CTLD) CFGTYPE(*CTL) STATUS(*ON)
    3600              GOTO       CMDLBL(NEXT)
    3700              ENDDO
    3800
    3900        /* OTHER STATUS ARE IGNORED */
    4000
    4100              ELSE       CMD(GOTO CMDLBL(NEXT))
    4200
    4300              ENDPGM
[/code:1:fcaf9b6af1]
3. 編譯 CL source,

[code:1:fcaf9b6af1]     CRTCLPGM PGM(your_lib_name/CHKCTLD) SRCFILE(your_lib_name/QCLSRC)[/code:1:fcaf9b6af1]

4. 欲監控上述檔案中的 Controller(s) 時, 請執行 CL command:
 
[code:1:fcaf9b6af1]    SBMJOB CMD(CALL PGM(CHKCTLD)) JOB(CHKCTLSTS)[/code:1:fcaf9b6af1]
 
5. 欲確認批次是否成功請執行 CL command:
 
[code:1:fcaf9b6af1]    WRKACTJOB SBS(QBATCH) -- 畫面類似如下
 
Opt  Subsystem/Job  User            Type  CPU %  Function        Status
        QBATCH             QSYS           SBS      .0                              DEQW 
             CHKCTLSTS   LAURENCE   BCH     .0       DLY-360          DLYW [/code:1:fcaf9b6af1]
 
6. 欲結束該程式只要如上述畫面, 在其前面的Opt欄位輸入'4'並按'F4', 於參數'How to end'處填入'*IMMED', 按執行鍵即可!!


PS: 請教一下, 有誰知道如要讓DLYJOB的DLY參數用variable代替要如何做呢?

 hanyu 回复于:2004-10-22 08:57:38
[code:1:3848c7f525]
PGM        PARM(&V@dlyt)                   
DCL        VAR(&V@dlyt) TYPE(*DEC) LEN(8 0)
DLYJOB     DLY(&V@dlyt)                    
ENDPGM                                     
[/code:1:3848c7f525]

 qingzhou 回复于:2004-10-22 09:55:48
感谢楼主提供了解决*CTLD设备inactive时的及时检测并激活的一种办法~~~

[quote:4616b33ba0="hanyu"]
PGM         PARM(&V@dlyt) 
                   
DCL         VAR(&V@dlyt) TYPE(*DEC) LEN(8 0) 
DLYJOB    DLY(&V@dlyt)   
                 
ENDPGM                               
[/quote:4616b33ba0]
对此我有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:26
总共4行, 自己测试啦!

 xuguopeng 回复于:2004-10-22 11:17:23
[quote:0366aa8e2b="qingzhou"]
对此我有3个疑问要请教hanyu:

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

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

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

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

3、只要把DLY的值做为参数传进来就可以了,可以在SBMJOB的时候给个数值就可以了

 qingzhou 回复于:2004-10-22 11:57:38
多谢~~~
“2、DLYJOB的参数就是数字型的 你给字符型的肯定不行 ”,我觉得还是要自己到本地环境测试效果会更好些。

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

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

测试中。。。

 LLee 回复于:2004-10-22 12:38:31
如果是要監控LIND的話, 您可自行修改程式碼. 舉Lan Card來說, 可透過RTVCFGSTS去辨別狀態再將其重新activate. 如有bind TCP/IP, 可再加入STRTCP及STRHOSTSVR SERVER(*ALL). 由於Batch Jobs一般皆submit至SBSD:QBATCH中執行, 所以當Lan Card因線路瞬斷造成LIND status異常, 亦不會影響該CLP程式的運作.

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

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

[code:1:912b298a19]    PGM        PARM(&SEC)                   
                                        
    DCL        VAR(&SEC) TYPE(*DEC) LEN(6 0)[/code:1:912b298a19]

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

[code:1:912b298a19]    DLYJOB /* Any parameters not reproduced because of severity of errors. */

    CPD0098 - Decimal value for parameter DLY is not valid.

    CPF0001 - Error found on DLYJOB command.[/code:1:912b298a19]

至於CPD0098內容如下:

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

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

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

PS: 我試過...將該variable宣告為*CHAR是不行的, log中有說明DLY的參數必須為numeric!!

 hanyu 回复于:2004-10-22 14:06:25
CPD0098 应该是把一个字符传给数字型参数了。

 hanyu 回复于:2004-10-22 14:22:15
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:45
原來是我CALL程式的問題!! 謝謝Mr. hanyu~

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

[code:1:b1b44d5efe]     100              PGM        PARM(&SEC)

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

    1400              TFRCTL     PGM(*LIBL/CHKCTLD) PARM(&SEC)
[/code:1:b1b44d5efe]

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

[code:1:b1b44d5efe]    SBMJOB CMD(CALL PGM(CHKCTLD) PARM(X'F000360F')) JOB(CHKCTLSTS)[/code:1:b1b44d5efe]

 LLee 回复于:2004-10-27 20:37:50
再次修改程式為可 "自動 (unattended) 判斷 *LIN / *CTL / *DEV 的狀態並保持該狀態為 ACTIVE" 如下:

1. 建立 Table (Physical File):

[code:1:44fd078489]    CREATE TABLE your_lib_name/CFGL
      (TYPCDE CHAR(1) NOT NULL,
       OBJNME CHAR(10) NOT NULL,
       PRIMARY KEY(TYPCDE, OBJNME)
      )[/code:1:44fd078489]

 其中 TYPCDE 的定義為:

[code:1:44fd078489]    '1' = *LIN ; '2' = *CTL ; '3' = *DEV[/code:1:44fd078489]

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

[code:1:44fd078489]    INSERT INTO your_lib_name/CFGL
      VALUES('3', 'QPADEV000B')[/code:1:44fd078489]

3. 編輯CL source:

[code:1:44fd078489]     100              PGM        PARM(&SEC)                      
     200                                                         
     300              DCL        VAR(&SEC) TYPE(*DEC) LEN(6 0)   
     400              DCL        VAR(&OBJTYP) TYPE(*CHAR) LEN(10)
     500              DCL        VAR(&STSCDE) TYPE(*DEC) LEN(5 0)
     600              DCLF       FILE(*LIBL/CFGL)                
     700                                                         
     800              MONMSG     MSGID(CPF0000)                  
     900                                                         
    1000  NEXT:       RCVF                                       
    1100                                                         
    1200       /* IF EOF IS DETECTED */                          
    1300                                                                   
    1400              MONMSG     MSGID(CPF0864) EXEC(DO)                   
    1500              DLYJOB     DLY(&SEC)                                 
    1600              TFRCTL     PGM(*LIBL/CHKCFGSTS) PARM(&SEC)           
    1700              ENDDO                                                
    1800                                                                   
    1900       /* CONVERT 'TYPCDE' TO APPROPRIATE OBJECT TYPE: */          
    2000       /*     '1' = *LIN                                                             */          
    2100       /*     '2' = *CTL                                                            */          
    2200       /*     '3' = *DEV                                                           */          
    2300                                                                   
    2400              IF         COND(&TYPCDE *EQ '3') THEN(CHGVAR +       
    2500                           VAR(&OBJTYP) VALUE('*DEV'))             
    2600              ELSE       CMD(IF COND(&TYPCDE *EQ '2') THEN(CHGVAR +
    2700                           VAR(&OBJTYP) VALUE('*CTL')))            
    2800              ELSE       CMD(IF COND(&TYPCDE *EQ '1') THEN(CHGVAR +
    2900                           VAR(&OBJTYP) VALUE('*LIN')))             
    3000              ELSE       CMD(GOTO CMDLBL(NEXT))                     
    3100                                                                    
    3200       /* RETRIEVE STATUS CODE OF CFGD */                           
    3300                                                                    
    3400              RTVCFGSTS  CFGD(&OBJNME) CFGTYPE(&OBJTYP) STSCDE(&STSCDE)
    3500                                                                    
    3600       /* IF OBJ IS NOT FOUND */                                    
    3700                                                                    
    3800              MONMSG     MSGID(CPF9801) EXEC(GOTO CMDLBL(NEXT))     
    3900                                                                    
    4000       /* CHECK CFGD STATUS IS 'VARY ON PENDING' OR 'RCYPND' */     
    4100                                                                    
    4200              IF         COND(&STSCDE = 20 *OR &STSCDE = 80) THEN(DO)
    4300              VRYCFG     CFGOBJ(&OBJNME) CFGTYPE(&OBJTYP) +         
    4400                           STATUS(*OFF) ASCVRYOFF(*YES)             
    4500              DLYJOB     DLY(20)                                    
    4600              VRYCFG     CFGOBJ(&OBJNME) CFGTYPE(&OBJTYP) STATUS(*ON)
    4700              GOTO       CMDLBL(NEXT)                               
    4800              ENDDO                                                 
    4900                                                                    
    5000       /* CHECK CFGD STATUS IS 'VARY OFF' */                        
    5100                                                                    
    5200              ELSE       CMD(IF COND(&STSCDE = 0) THEN(DO))         
    5300              VRYCFG     CFGOBJ(&OBJNME) CFGTYPE(&OBJTYP) STATUS(*ON)
    5400              GOTO       CMDLBL(NEXT)
    5500              ENDDO                  
    5600                                     
    5700        /* OTHER STATUS ARE IGNORED */         
    5800                                               
    5900              ELSE       CMD(GOTO CMDLBL(NEXT))
    6000                                               
    6100              ENDPGM                           [/code:1:44fd078489]

4. 編譯程式:

[code:1:44fd078489]    CRTCLPGM PGM(your_lib_name/CHKCFGSTS) SRCFILE(your_lib_name/QCLSRC)[/code:1:44fd078489]

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

[code:1:44fd078489]    SBMJOB CMD(CALL PGM(CHKCFGSTS) PARM(X'F000360F')) JOB(CHKCFGSTS)[/code:1:44fd078489]

 qingzhou 回复于:2004-10-27 22:13:27
很好,有上进心...

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

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

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

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

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有