| qingzhou 回复于:2004-10-14 11:06:48 | ||||||||||||
| [quote:78fd6d0b0e="xuguopeng"].........
到底有多少MSG是不能MONITOR的??? [/quote:78fd6d0b0e] :em06: :em06: :em06: 1。只有当前登陆OS/400的user prifile、PGM提交的环境(QINTER还是QBATCH)以及PGM三者当前的JOBD、 Inquiry message reply参数指定一致时,才能生效。包括使用WRKRPYLE命令时环境也必须一致。所以...... 希望能理解我的意思。 2。“我只是希望不管出了任何错都不要中断,只要把LOG写到SPLF中就可以了...”这样做如果数据备份不成功有意义吗? | ||||||||||||
| silver.lake 回复于:2004-10-14 11:19:51 | ||||||||||||
| CPF0000 only monitor all CPF message | ||||||||||||
| xuguopeng 回复于:2004-10-14 13:11:13 | ||||||||||||
| 收到~ 3Q 3Q
我的用途是 因为备份中有一个LIB是PM400 他是ACTIVE的 所以可能会备份不完全,我在单独SAV这个LIB的时候如果有一个OBJ没有SAV成功,会发出CPF3777的MSG,虽然我在SAVLIB语句后已经用了MONMSG CPF0000 | ||||||||||||
| qingzhou 回复于:2004-10-14 14:39:20 | ||||||||||||
| 用SAVLIB LIB(PM400) DEV(TAP01) SAVACT(*LIB)试试...... | ||||||||||||
| xuguopeng 回复于:2004-10-14 15:01:56 | ||||||||||||
| 本来就是这样写的 即使选了*LIB也有可能无法全部SAVE的 | ||||||||||||
| qingzhou 回复于:2004-10-14 15:55:55 | ||||||||||||
| PM400是个啥玩意? | ||||||||||||
| xuguopeng 回复于:2004-10-14 15:58:49 | ||||||||||||
| PM400是性能管理用的了 能自动收集性能数据 IBM会把这些性能数据做成PDF分析报告 很不错的 是免费的 | ||||||||||||
| qingzhou 回复于:2004-10-14 16:04:58 | ||||||||||||
| [quote:d61232de46="xuguopeng"]PM400是性能管理用的了 能自动收集性能数据 IBM会把这些性能数据做成PDF分析报告 很不错的 是免费的[/quote:d61232de46]
恩,经你说一下我有点印象了,以前论坛里还有人提问如何END PM400呢。 好象一些资料也有介绍关于PM400的使用方法。 我觉得备份该玩意时是不是要先END掉PM400才能SAVLIB呀,难道不支持SAVACT参数? :em14: :em14: :em14: 我回去查查资料,看看能不能琢磨出什么原因来。。。 :mrgreen: | ||||||||||||
| xuguopeng 回复于:2004-10-14 16:22:58 | ||||||||||||
| SAVACT应该是支持的,但是SAVACT默认也只是等待120秒罢了
PM400的OBJ可能一直都是ACTIVE的 其实他的备份是否完整到不是很重要了 主要我想知道我用了MONMSG CPF0000为什么不能忽略CPF3777? | ||||||||||||
| qingzhou 回复于:2004-10-14 18:25:29 | ||||||||||||
| guopeng,我下午仔细研究了一下SAVACT参数,共有4个:*NO、*LIB、*SYNCLIB、*SYSDFN,它们的区分让我折腾了一陈子才理解明白。 :em06: :em06: :em06:
[color=red:e463fac271]【此次再次理解SAVACT参数,并更IBMer确认后修正理解如下,以免误导大家。】[/color:e463fac271] 1。*NO表示不启用save active方式备份; 2。*LIB、*SYNCLIB、*SYSDFN都是针对备份多个LIB时而发挥作用,对于备份单个LIB,*LIB和*SYNCLIB几乎没有什么区别。 3。*LIB和*SYNCLIB是备份多个LIB时采用一个同步时间点进行判断备份,而*SYSDFN是备份多个LIB时系统自动采用多个同步时间点来进行判断备份。那*LIB和*SYNCLIB之间有什么区别呢?请看下文。 4。*LIB表示当同时备份多个LIB时,只采用一个同步时间点备份,但无法保证同时备份的多个LIB能够同步备份,如果备份的LIB之间存在关联,采用*LIB方式很容易造成备份的数据存在问题。 而*SYNCLIB表示同时备份多个LIB时,也是只采用一个同步时间点进行备份,但备份时能够使多个LIB进行数据同步,这样即使这些备份的LIB存在关联,也是能够成功的。 5。*SYSDFN表示备份多个LIB时系统采用过个同步时间点进行同步备份,特别适合所备份的LIB之间存在关联情况。 6。由此可见,如果我们想让多个active library备份成功,选择的参数不应该选*lib,而应该选择*SYSDFN成功率更高,因为*SYSDFN提供了多个同步时间点去扫描系统LIB当前的状态,比如17:00为第1个同步时间点,17:10为第2个同步时间点,17:20为第3个同步时间点;当然同时我们也可以适当修改save active wait time参数增大备份延续时间。 7。由此,我们可以深刻体会SAVACT参数和save active wait time参数这2个参数配合起来实施“联机备份”的意义所在。 银行、保险部门在实时备份数据机制方面尤其突出,特别是银行,更常使用后面2个参数来执行数据备份(*SYNCLIB、*SYSDFN);但是话说回来,由于银行的交易数据太大,单纯采用SAVLIB根本无法满足24小时联机备份机制,所以银行目前采用的是利用MIMIX、OMS、DataMirror等第三方商业软件利用"JOURNAL RECEIVE"同步原理来进行24小时联机备份。 另外,据我了解,PM400软件是个LICPGM软件,而不是免费的。V5R2版本安装5722PT1这个LICPGM后,会创建好几个LIB,其中[QPM4CON]这个LIB是保存系统OBJ的,而[QMPGDATA]这个LIB是保存你经过PM400软件对系统进行性能分析后得出的pdf数据等。其实你只需备份[QMPGDATA]这个LIB即可,如果真要备份[QPM4CON],建议采用SAVACT(*SYSDFN)或(*SYNCLIB)试试。 | ||||||||||||
| michael9406 回复于:2004-10-14 21:28:24 | ||||||||||||
| 我们可以请老刘写书了。 | ||||||||||||
| ibmas400 回复于:2004-10-14 22:23:24 | ||||||||||||
| 我们从qingzhou身上看到了他刻苦钻研的精神,既提高了自己,又帮助了别人。
这篇帖子解答得很好,而且很详细,应该设精! :m01: | ||||||||||||
| xuguopeng 回复于:2004-10-15 09:01:27 | ||||||||||||
| 对 我明白,但是还是没有正面回答我的问题啊?
我问的是为什么MONMSG CPF0000不能忽略CPF3777?? | ||||||||||||
| zzzddd 回复于:2004-10-15 10:12:22 | ||||||||||||
| 为什么MONMSG CPF0000能忽略CPF3777??你哪本书上看到过的??? | ||||||||||||
| xuguopeng 回复于:2004-10-15 11:59:42 | ||||||||||||
| MONMSG CPF0000难道不是可以monitor所有CPF*的MSG么?? | ||||||||||||
| yoyoage 回复于:2004-10-15 20:59:09 | ||||||||||||
| 可以,不过你要把monmsg cpf0000 紧跟declare 语句。 | ||||||||||||
| stephenxie2003 回复于:2004-10-18 14:06:13 | ||||||||||||
| 仔细看了一下,分析得的确很好啊!
值得大家学习一下! 共同提高! :) | ||||||||||||
| xuguopeng 回复于:2004-10-18 17:54:26 | ||||||||||||
| [quote:dd5ba7395d="yoyoage"]可以,不过你要把monmsg cpf0000 紧跟declare 语句。[/quote:dd5ba7395d]
紧跟DECLARE语句? 不明白 我只是SAVLIB。。。。。。 MONMSG MSGID(CPF0000) SAV和MONMSG之间肯定没别的语句了 这点常识我是有的 我就是不明白 明明这样可以忽略CPF*的MSG 可还是报CPF3777了。。。。 :em06: | ||||||||||||
| yoyoage 回复于:2004-10-18 18:23:45 | ||||||||||||
| 没有declare语句当然就应该作为程序的第一个语句了。
表达的更准确些,就是把它作为第一个可执行的语句。:) | ||||||||||||
| qingzhou 回复于:2004-10-19 10:00:25 | ||||||||||||
| [quote:7761a2692d="yoyoage"]没有declare语句当然就应该作为程序的第一个语句了。
表达的更准确些,就是把它作为第一个可执行的语句。:)[/quote:7761a2692d] [code:1:7761a2692d] *************** Beginning of data ************************************* 0001.00 /************************************************************/ 0002.00 /** DAILY JOB **/ 0003.00 /** PGM ID DOMINO_ONLINE **/ 0004.00 /** PGM NAME DAILY DOMINO ONLINE **/ 0005.00 /**--------------------------------------------------------**/ 0006.00 /** PGM DESCRRIPTION **/ 0007.00 /** **/ 0008.00 /** CREATION DATE 04/10/14 **/ 0009.00 /** PROGRAMMER NAME QINGZHOU **/ 0010.00 /** UPDATE DATE **/ 0011.00 /************************************************************/ 0012.00 PGM 0013.00 0014.00 DCL VAR(&DAY) TYPE(*CHAR) LEN(4) 0015.00 0016.00 MONMSG MSGID(CPF0000) 0017.00 0018.00 CHGJOB OUTQ(QPRINT) 0019.00 0020.00 /* DOMINO ONLINE START */ 0021.00 0022.00 STRDOMSVR SVR(Domino_Server_Name) 0023.00 MONMSG MSGID(CPF0000) 0024.00 0025.00/* OTHER SBSD START */ 0026.00 0027.00 QSYS/STRSBS SBSD(QINTER) 0028.00 MONMSG MSGID(CPF0000) 0029.00 0030.00 ENDPGM: ENDPGM ****************** End of data **************************************** [/code:1:7761a2692d] 另外,guopeng, "MONMSG MSGID(CPF0000)" = "忽略所有的CFP****"??? :em06: :em06: :em06: | ||||||||||||
| xuguopeng 回复于:2004-10-19 10:57:25 | ||||||||||||
| [code:1:d26d55ff9a]0014.00 DCL VAR(&DAY) TYPE(*CHAR) LEN(4)
0015.00 0016.00 MONMSG MSGID(CPF0000) [/code:1:d26d55ff9a] 这有必要么?? MONMSG CPF0000难道不是监控所有CPF开头的MSG么??? :em14: :em14: :em14: | ||||||||||||
| silver.lake 回复于:2004-10-19 11:27:28 | ||||||||||||
| Beginning of the program
-- Program level MONMSG , monitor message sent by all of commands in the program (maximum of 100). Following the command -- Command level MONMSG, override a program-level MONMSG command If zeros are specified in either two or all four of the rightmost positions, such as ppmm00, a generic message identifier is specified. For example, if CPF0000 is specified, all the CPF messages are monitored. Refer to the MONMSG online help... | ||||||||||||
| xuguopeng 回复于:2004-10-19 12:45:47 | ||||||||||||
| 我就是这么理解的呀 所以我才问为什么我用了MONMSG CPF0000后他还报CPF3777??
感觉好象大家都没听懂我问的是什么呀? | ||||||||||||
| qingzhou 回复于:2004-10-19 12:55:46 | ||||||||||||
| [quote:ba7755b308="xuguopeng"]这有必要么??
[code:1:ba7755b308]0014.00 DCL VAR(&DAY) TYPE(*CHAR) LEN(4) 0015.00 0016.00 MONMSG MSGID(CPF0000) [/code:1:ba7755b308] MONMSG CPF0000难道不是监控所有CPF开头的MSG么??? :em14: :em14: :em14:[/quote:ba7755b308] 有“MONMSG MSGID(CPF0000)”紧跟DCL定义变量的语句之后,是表示对整个CLP程序的全局所有CPF****错误信息进行监控。 一般我们在开发PGM时,一个好的习惯是尽量规范程序的编写(含注释习惯),同时也尽量做到程序每一步骤出错时能够监管。 :mrgreen: :mrgreen: :mrgreen: “MONMSG CPF0000难道不是监控所有CPF开头的MSG么???”这句话很正确。 :em02: :em02: :em02: 但是“我就是不明白, 明明这样可以[size=18:ba7755b308][color=red:ba7755b308]忽略[/color:ba7755b308][/size:ba7755b308]CPF*的MSG 可还是报CPF3777了。。。。 ”这句话让我陷入了迷茫~~~ :em23: :em23: :em23: | ||||||||||||
| stephenxie2003 回复于:2004-10-20 10:37:29 | ||||||||||||
| 对阿,我记得只要把MONMSG MSGID(CPF0000)放在所有语句的最开头,就可以自动答复所有的系统messager了吧?
:) | ||||||||||||
| qingzhou 回复于:2004-10-22 10:34:36 | ||||||||||||
| xu兄,我们继续讨论这个问题,我觉得关于MONMSG很常用但又很实用、很重要。 :mrgreen: :mrgreen: :mrgreen:
以下是关于MONMSG用法的详细解答,看看他们是怎么说的~~~ ========================================================= [b:03fa709c04]8.3 在CL过程或程序中监控信息[/b:03fa709c04] 可在过程或程序中用命令,或在另外的过程或程序中的命令来监控送到过程或程序中的逃逸、通知和状态信息。MONMSG命令监控在命令中规定条件的送往调用信息队列中的信息,如果条件存在,则运行MONMSG中规定的命令。MONMSG的功能如下: 逃逸信息:它告诉过程或程序有错误条件发生,强行结束发送者。要监控这类信息,你要采取适当的动作或清理及结束过程或程序。 状态或通知信息:它告诉过程或程序是一个正常结束的条件,它不至于结束发送者。 要监控这类信息,过程或程序可以检查这些条件,也能使功能不继续进行。 可用二级MONMSG命令监控信息: 过程级:在CL过程或程序的DCL命令后立即用MONMSG命令来监控逃逸、通知或状态信息,这叫做过程级的MONMSG命令,在一个过程或OPM程序中可以使用至多100个这样的MONMSG命令,这就让你对所有命令用同一种方法来处理相同的逃逸信息,EXEC参数是可选的,且在EXEC中只能规定GOTO命令。 (附图) 解释: 1.MONMSG、检查消息、诊断和完成信息。 2.CPF0000的程序级MONMSG由逃逸、状态、通知信息激活。 3.CPF9999(功能检查)的程序级MONMSG由不是其它命令或程序级监控的逃逸信息激活。在CPF9999送往过程前,原逃逸信息过滤给同一CL程序中的活动过程。如原逃逸信息没被活动的过程处理,则发送CPF9999。 4.如果状态信息送往*EXT,就不能监控它。 命令级:在CL过程或程序中的命令后立即用MONMSG命令来监控逃逸、通知或状态信息,这叫命令级的MONMSG命令,可对一个命令使用多至100个命令 级MONMSG,这让你可用不同的方法处理不同的逃逸信息。 要监控这些信息,要在MONMSG命令中用如下格式之一规定信息的一般标识: pppmmnn:监控某个信息,例如MCH1211是零做除数的逃逸信息。 pppmm00:监控用某个特许程序码(ppp)开头的由mm规定的数字信息标识。 例如: CPF5100指出所有以CPF51开头的通知、状态和逃逸信息。 ppp0000:监控信息标识以ppp开头的信息。例如CPF0000指出要监控以CPF开头的所有通知、状态和逃逸信息。 注:在做系统功能时不要用MONMSG CPF0000,安装、备份、恢复系统时也不 要用它,因为可能会去掉一些重要信息。 CPF9999:监控所有信息标识的功能检测信息,如果对一个错误信息没有监控, 则它成为CPF9999(功能检测)。 注:一般来说,在送出通知和诊断信息时,控制也转给监控程序。 除了用信息标识监控逃逸信息外,也能用MONMSG中规定的字符串与信息中的数据进行比较。下面的命令监控MYFILE的逃逸信息CPF5101,文件名做为信息数据发送。 [code:1:03fa709c04]MONMSG MSGID(CPF5101) CMPDTA(MYFILE) EXEC(GOTO EOJ)[/code:1:03fa709c04] 比较数据可以是28个字符长,比较从信息数据的第一个字段的第一个字符开始,如果它们匹配,则执行EXEC参数中规定的动作。 在EXEC参数中规定如何处理逃逸信息,除PGM、ENDPGM、IF、ELSE,DCL,DCLF,ENDDO和MONMSG外,其余命令都能在EXEC中规定。在EXEC中可以规定DO命令,此时运行在DO组内的命令。在运行时,控制返回给发送逃逸之后的命令,但如果规定GOTO或RETURN命令,则控制不返回,如果没规定EXEC,则忽略逃逸,过程继续执行。下面是CHGVAR命令的例子,它监控要做除数的逃逸信息,信息标识为MCH1211: [code:1:03fa709c04]CHGVAR VAR(&A) VALUE(&A / &B) MONMSG MSGID(MCH1211) EXEC(CHGVAR VAR(&A) VALUE(1))[/code:1:03fa709c04] 变量&A的值修改为&A除以&B的值。如果&B=0,不能做除法,且送给过程一个逃逸信息,这时,&A的值变为1,(在EXEC参数中规定)。你也可以测试&B的值,仅在它不是零时才做除法。在下例中,程序监控逃逸信息CPF9801(目标没找到),它由CHKOBJ命令产生: [code:1:03fa709c04]PGM CHKOBJ LIB1/PGMA *PGM MONMSG MSGID(CPF9801) EXEC(GOTO NOTFOUND) CALL LIB1/PGMA RETURN NOTFOUND: CALL FIX001 /* PGMA Not Found Routine */ ENDPGM[/code:1:03fa709c04] 下列CL过程包括二个CALL命令和一个过程级的对CPF0001的监控命令。(如果不能成功地完成CALL命令,则产生逃逸信息)。如果有一个CALL失败,过程送出完成信息且结束。 [code:1:03fa709c04]PGM MONMSG MSGID(CPF0001) EXEC(GOTO ERROR) CALL PROGA CALL PROGB RETURN ERROR: SNDPGMMSG MSG('A CALL command failed') MSGTYPE(*COMP) ENDPGM[/code:1:03fa709c04] 如果在MONMSG命令中没有规定EXEC,则忽略任何逃逸信息,如果在除IF以外的命令上发生逃逸信息,过程或程序继续处理下一个不产生逃逸信息的命令,如果在IF命令中发生逃逸信息,过程或程序继续处理IF命令中为假的条件。下例解释不同类型发生逃逸信息时所做的处理: [code:1:03fa709c04]PGM DCL &A TYPE(*DEC) LEN(5 0) DCL &B TYPE(*DEC) LEN(5 0) MONMSG MSGID(CPF0001 MCH1211) CALL PGMA PARM(&A &B) IF (&A/&B *EQ 5) THEN(CALL PGMB) ELSE CALL PGMC CALL PGMD ENDPGM[/code:1:03fa709c04] 根据发生逃逸信息的地方不同,能发生下列情况: 如果在调用PGMA时产生CPF0001,过程重新处理IF命令; 如果在IF命令中发生MCH1211,IF条件失败,过程处理调用PGMC; 如果在调用PGMB和PGMC时发生CPF0001,过程调用PGMD; 如果在调用PGMD时,发生CPF0001,过程执行ENDPGM,它返回到调用过程 也可由过程或程序中的命令或另外的命令来监控发送的相同逃逸信息,这就需要三个MONMSG命令,一个命令写在需要处理逃逸信息的命令下面,它用在发生逃逸信息的时候,另一个MONMSG跟在最后一个DCL命令后,它能够监控所有其它的命令。 仅在过程或程序需要监控信息时才用MONMSG命令,一个过程中的MONMSG不能被同一程序中的另外过程使用。程序设计参考一书列出CL命令发出的逃逸、通知、状态信息,你也可以列出自己定义的所有信息的表。 [b:03fa709c04]8.3.1 缺省处理[/b:03fa709c04] 多数逃逸信息会送往调用命令、程序或过程的过程中,你可能不想监控所有的信息,只想监控和处理对过程功能有影响的那些信息,系统对你没有监控的任何信息提供了缺省监控及处理。 缺省处理假定在过程中检测到了错误。如果用调试过程,会有信息送到工作站,然后可以改它,如果没有用调试,系统会做一个信息过滤功能,此功能分为两步: 移动调用堆栈中逃逸信息开始的一步 检查看有没有MONMSG监控逃逸 如果有MONMSG,则停止信息过滤,采取命令中规定的动作,继续进行信息过滤直到遇到另一个MONMSG或遇到一个嵌套组的边界,即逃逸信息不能跨越活动组边界进行过滤。 如果在有MONMSG命令且有信息提供的过程前遇到活动级边界,则开始功能检测处理,原逃逸例外的动作被认为是完成了,然后发出CPF9999送给原逃逸的目的过程。如果过程有MONMSG做功能检测,则采取命令规定的动作,如果没有MONMSG,则把查询信息送往交互作业的工作站操作员,操作员能用下列之一回答: R 重试失败的命令 I 忽略信息,继续处理下一条命令 C 取消过程,对堆栈中下一个过程做过滤功能检测 D 对失败过程转储者调用堆栈入口,取消过程,对堆栈的下一个过程过滤功能检测。如果给出回答或作业是批作业,这是缺省的动作。 功能检测不能跨越活动组边界。如果所做回答引起功能检测跨越一个活动组边界,那么会停止做进一步的功能检测,所有到达活动组边界的过程都被取消,逃逸信息CEE9901送往前一个堆栈入口。 你能监控功能检测的逃逸信息,因此可以做: 清理及结束过程 继续处理过程的其它问题 注:如果没监控的逃逸的信息描述规定了一个缺省动作,在发送功能检测信息之前调用缺省处理程序,当缺省处理程序返回时,开始功能检测处理。
| ||||||||||||