| 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即可自动恢复.
|