| 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')”对变量进行赋初值吗? |
| ewmisclearcase/" target="_blank" >cc 回复于: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即可自动恢复. |