AS/400开发经验点滴(四)如何在程序中获取系统ASP使用率等系统状态信息

七.如何在程序中获取系统ASP使用率等系统状态信息

AS/400系统管理员都对系统ASP空间增长情况很关心,当系统ASP空间涨满了以后将会引起系统DOWN机等安全问题。系统ASP空间与硬盘空间并不完全等同,如果系统只配置了一个ASP分区,那么系统ASP空间与硬盘空间是等同的,如果系统配置了多个ASP分区,则系统ASP只是ASP 1的分区。用WRKSYSSTS命令查看到的% system ASP used就是表示系统ASP空间的使用率。

与系统ASP空间使用率有关的系统值有两个:QSTGLOWLMT和QSTGLOWACN。QSTGLOWLMT系统值设定了最小硬盘空间警告线百分比,比如设定为5,即表示系统ASP使用率达到95%,即引起安全动作,安全动作由系统值QSTGLOWACN设定。

能不能在程序中自动获取系统ASP使用率,这样当硬盘空间达到危险值时,由程序提前报警呢?或者在程序中自动执行一些安全动作,比如自动清理一些过时的文件,或停止某些程序运行,以降低系统ASP使用率? 

OS/400系统提供了一个叫QWCRSSTS的API函数,该函数功能就可以提取用WRKSYSSTS命令看到的系统状态信息,还可以提取更多的用WRKSTSSTS命令看不到的一些其他系统信息。可以在RPG、C、CL等程序里调用该API以获取系统信息。该函数的详细使用说明可以参看《System API Reference》这本书。

下面我用一个实际获取系统ASP使用率的CL程序做例子,来看看如何使用QWCRSSTS。

QWCRSSTS共有五个入口参数,第一个参数是接受返回系统状态信息的输出参数,存放的是返回系统状态信息块。该系统状态信息块是按照一定结构来存放各种系统状态信息的。第二个参数是输入参数,指定第一个接受系统状态信息块变量的长度,类型为Binary。第三个参数是指定第一个参数系统状态信息块中的系统信息存放结构名,共有三种不同的结构可选,分别是:SSTS0100、SSTS0200、SSTS0300。第四个参数是表示是否重新设置状态统计,通常我们选*YES。第五个参数是错误码。

在本示例CL程序中,指定使用SSTS0200系统状态信息结构。该结构中53-57位存放的就是% system ASP used。该值除上10000,就是正常百分比。在程序中先是提取QSTGLOWLMT系统值,指定100-QSTGLOWLMT-2为程序警告线,比如QSTGLOWLMT如果设为5,那么当系统ASP到93%的时候,程序会向用户发出一个消息。同时把ASP状态返回值设为1,以供其他程序调用,当调用程序判断ASP状态返回值为1的时候,就知道系统ASP空间利用率到了警告线,需要执行一些安全动作了。

/*===================================================================*/

/*                                                                       */

/*-----------------------------------------------------------------------------------------------------------------*/

/*     PROGRAM NAME    : MONASP                                         */

/*     CREATED BY      : BLOG LIOU                                        */

/*     CREATED DATE    : 2003.11.11                                          */

/*     DESCRIPTION     : Monitor ASP Used                                    */

/*                       MonASPPer: (100-STGLOWLMT)-2                      */

/*===================================================================*/

             PGM        PARM(&ASPFLAG)                                

             DCL        VAR(&ASPFLAG) TYPE(*CHAR) LEN(1)              

             DCL        VAR(&FORMAT) TYPE(*CHAR) LEN(8)  +             

                          VALUE('SSTS0200')                           

             DCL        VAR(&LENFLD) TYPE(*CHAR) LEN(4) +             

                          VALUE(X'00000044')                           

             DCL        VAR(&SYSNAM) TYPE(*CHAR) LEN(8)                

             DCL        VAR(&SYSUSEC) TYPE(*CHAR) LEN(4)               

             DCL        VAR(&SYSUSE) TYPE(*DEC) LEN(9 2)               

             DCL        VAR(&SYSINFO) TYPE(*CHAR) LEN(68)              

             DCL        VAR(&ERRCODE) TYPE(*CHAR) LEN(8) +             

                          VALUE(X'0000000000000000')                   

             DCL        VAR(&RESETSY) TYPE(*CHAR) LEN(10) VALUE(*YES)  

             DCL        VAR(&QMNPER) TYPE(*DEC) LEN(9 2) VALUE(1000000)

             DCL        VAR(&QALARM) TYPE(*DEC) LEN(9 2) VALUE(20000)  

             DCL        VAR(&STGLOWLMT) TYPE(*DEC) LEN(9 2)            

             DCL        VAR(&SNDMSG) TYPE(*CHAR) LEN(10)               

                                                                       

             CHGVAR     VAR(&ASPFLAG) VALUE('0')                       

             RTVSYSVAL  SYSVAL(QSTGLOWLMT) RTNVAR(&STGLOWLMT)       

             CHGVAR     VAR(&STGLOWLMT) VALUE(&STGLOWLMT * 10000)   

             CHGVAR     VAR(&QMNPER) VALUE(&QMNPER - &STGLOWLMT)    

             CHGVAR     VAR(&QMNPER) VALUE(&QMNPER - &QALARM)       

                                                                    

             CALL      PGM(QWCRSSTS) PARM(&SYSINFO &LENFLD &FORMAT +

                          &RESETSY &ERRCODE)                        

             MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERREND))   

             CHGVAR     VAR(&SYSUSEC) VALUE(%SST(&SYSINFO 53 4))    

             CHGVAR     VAR(&SYSUSE) VALUE(%BINARY(&SYSUSEC))       

             CHGVAR     VAR(&SYSNAM) VALUE(%SST(&SYSINFO 17 8))     

             IF         COND(&SYSUSE >; &QMNPER) THEN(DO)            

             CHGVAR     VAR(&SNDMSG) VALUE(&SYSUSE)                 

             SNDPGMMSG  MSG(&SYSNAM *BCAT ' - (ASP USED +           

                          PERCENT)*10000 = ' *BCAT &SNDMSG) +          

                          TOMSGQ(MYUSER)                                

             SNDPGMMSG  MSG('*****SYSTEM OVER MonASP !!! ') +

 TOMSGQ(MYUSER) MSGTYPE(*INFO)

             CHGVAR     VAR(&ASPFLAG) VALUE('1')                       

             ENDDO                                                     

             GOTO       CMDLBL(END)                                    

                                                                       

 ERREND:    SNDPGMMSG  MSG(' ERROR ON QWCRSSTS CALL') +    

                          TOMSGQ(MYUSER) MSGTYPE(*INFO)                 

 END:        ENDPGM                                                    

                                                        
               

该程序也可以与某些报警程序连起来使用,比如当系统ASP空间达到警告线后,程序调用某些拨号程序,就可以给系统管理员手机发短信息等。

如果再设计一个显示文件,把QWCRSSTS获取到的系统状态信息,比如系统ASP使用率、CPU使用率、系统出现Message进程数,都显示出来,我们就实现了一个系统状态信息的监视工具。 

原文地址:https://www.cnblogs.com/etsdpt/p/2317068.html