示例: 更改活动作业

"更改活动作业" (CHGACTJOB) 程序的此命令接口可降低具有相同名称的活动作业的运行优先级。

您还可以使用指定的用户名来降低作业的运行优先级。 您有下列选项:

  • 指定作业名或 *ALL 值。
  • 指定用户名作为 *ALL 值。
  • 使用缺省运行优先级 99。

CHGACTJOB 命令确保下列其中一项为真:

  • 未指定所有作业。
  • 未对 JOB 参数指定 *ALL 值。
  • 没有为 USER 参数指定 *ALL 值。

此示例使用以下 API:

  • 创建用户空间 (QUSCRTUS)
  • 列示作业 (QUSLJOB)
  • 检索用户空间 (QUSRTVUS)
  • 检索作业信息 (QUSRJOBI)

以下是 "更改活动作业" (CHGACTJOB) 命令所需的消息描述:

ADDMSGD MSGID(USR3C01) MSGF(QCPFMSG) +
MSG('JOB(*ALL) is not valid with USER(*ALL)') SEV(30)

以下是 CHGACTJOB 命令的命令定义:

    CMD        PROMPT('Change Active Jobs')
               /* CPP CHGACTJOB */
    PARM       KWD(JOB) TYPE(*NAME) LEN(10) +
                 SPCVAL((*ALL)) MIN(1) +
                 PROMPT('Job name:')
    PARM       KWD(USER) TYPE(*NAME) LEN(10) DFT(*ALL) +
                 SPCVAL((*ALL) (*CURRENT)) PROMPT('User +
                 name:')
    PARM       KWD(RUNPTY) TYPE(*DEC) LEN(5 0) DFT(99) +
                 RANGE(00 99) PROMPT('Run priority:')
    DEP        CTL(&USER *EQ *ALL) PARM((&JOB *NE *ALL)) +
                 NBRTRUE(*EQ 1) MSGID(USR3C01)

要创建该命令,请指定以下内容:

CRTCMD CMD(QGPL/CHGACTJOB) PGM(QGPL/CHGACTJOB) +
  SRCFILE(QGPL/CMDSRC)

以下是以 CL 编写的命令处理程序,用于列示活动作业并在必要时降低运行优先级:

注: 通过使用代码示例,您同意 代码许可证和免责声明信息的条款。

 /* ***************************************************************** */
 /* PROGRAM:  CHGACTJOB                                               */
 /*                                                                   */
 /* LANGUAGE:  CL                                                     */
 /*                                                                   */
 /* DESCRIPTION:  THIS PROGRAM WILL REDUCE THE RUN PRIORITY OF ACTIVE */
 /*               JOBS WITH THE SAME NAME.                            */
 /*                                                                   */
 /* APIs USED:  QUSCRTUS, QUSLJOB, QUSRTVUS, QUSRJOBI                 */
 /*                                                                   */
 /* ***************************************************************** */
             PGM        PARM(&JOB &USER &RUNPTY)

 /*                                                                   */
 /* Input parameters                                                  */
 /*                                                                   */

             DCL        VAR(&JOB) TYPE(*CHAR) LEN(10) +
                          /* Input job name */
             DCL        VAR(&USER) TYPE(*CHAR) LEN(10) +
                          /* Input user name */
             DCL        VAR(&RUNPTY) TYPE(*DEC) LEN(5 0) +
                          /* Input run priority */

 /*                                                                   */
 /* Local variables                                                   */
 /*                                                                   */

             DCL        VAR(&RJOB) TYPE(*CHAR) LEN(10) +
                          /* Retrieve job name */
             DCL        VAR(&RUSER) TYPE(*CHAR) LEN(10) +
                          /* Retrieve user name */
             DCL        VAR(&RNBR) TYPE(*CHAR) LEN(6) +
                          /* Retrieve job number */
             DCL        VAR(&RUNPTYC) TYPE(*CHAR) LEN(5) +
                          /* Input run priority in character form */
             DCL        VAR(&RUNPTY8) TYPE(*DEC) LEN(8 0) +
                          /* Retrieve run priority after convert from +
                             binary 4 */
             DCL        VAR(&RUNPTY5) TYPE(*DEC) LEN(5 0) +
                          /* Retrieve run priority in decimal 5,0 +
                             form */
             DCL        VAR(&RUNPTY5C) TYPE(*CHAR) LEN(5) +
                          /* Retrieve run priority in character form */
             DCL        VAR(&RUNPTY4) TYPE(*CHAR) LEN(4) +
                          /* Retrieve run priority in binary 4 form */
             DCL        VAR(&NUMBER) TYPE(*CHAR) LEN(6) +
                          /* Current job number */
             DCL        VAR(&USRSPC) TYPE(*CHAR) LEN(20) +
                          VALUE('CHGA      QTEMP     ') +
                          /* User space name for APIs */
             DCL        VAR(&EUSRSPC) TYPE(*CHAR) LEN(10) +
                          /* User space name for commands */
             DCL        VAR(&JOBNAME) TYPE(*CHAR) LEN(26) +
                          VALUE('                    *ALL  ') +
                          /* Full job name for list job  */
             DCL        VAR(&BIN4) TYPE(*CHAR) LEN(4) +
                          /* Number of jobs for list job and +
                             User space offset in binary 4 form */
             DCL        VAR(&LOOP) TYPE(*DEC) LEN(8 0) +
                          /* Number of jobs from list job */
             DCL        VAR(&DEC8) TYPE(*DEC) LEN(8 0) +
                          /* User space offset in decimal 8,0 form */
             DCL        VAR(&ELEN) TYPE(*DEC) LEN(8 0) +
                          /* List job entry length in decimal 8,0 +
                             form */
             DCL        VAR(&ELENB) TYPE(*CHAR) LEN(4) +
                          /* List job entry length in binary 4 +
                             form */
             DCL        VAR(&LJOBE) TYPE(*CHAR) LEN(52) +
                          /* Retrieve area for list job entry */
             DCL        VAR(&INTJOB) TYPE(*CHAR) LEN(16) +
                          /* Retrieve area for internal job id */
             DCL        VAR(&JOBI) TYPE(*CHAR) LEN(104) +
                          /* Retrieve area for job information */
             DCL        VAR(&JOBTYPE) TYPE(*CHAR) LEN(1) +
                          /* Job type */

 /*                                                                   */
 /* Start of executable code                                          */
 /*                                                                   */

 /*                                                                   */
 /* Retrieve job number to use for local user space name              */
 /*                                                                   */

             RTVJOBA    NBR(&NUMBER)
             CHGVAR     VAR(%SST(&USRSPC 5 6)) VALUE(&NUMBER)
             CHGVAR     VAR(&EUSRSPC) VALUE(%SST(&USRSPC 1 10))

 /*                                                                   */
 /* Delete user space if it already exists                            */
 /*                                                                   */

             DLTUSRSPC  USRSPC(QTEMP/&EUSRSPC)
             MONMSG CPF0000

 /*                                                                   */
 /* Create user space                                                 */
 /*                                                                   */

             CALL QUSCRTUS (&USRSPC 'CHGACTJOB ' X'00000100' ' ' +
                            '*ALL      ' +
                            'CHGACTJOB TEMPORARY USER SPACE')

 /*                                                                   */
 /* Set up job name for list jobs                                     */
 /*                                                                   */

             CHGVAR     VAR(%SST(&JOBNAME 1 10)) VALUE(&JOB)
             CHGVAR     VAR(%SST(&JOBNAME 11 10)) VALUE(&USER)

 /*                                                                   */
 /* List active jobs with job name specified                          */
 /*                                                                   */

             CALL QUSLJOB  (&USRSPC 'JOBL0100' &JOBNAME +
                            '*ACTIVE   ')

 /*                                                                   */
 /* Retrieve number of entries returned. Convert to decimal and       */
 /* if zero go to NOJOBS label to send out 'No jobs' message.         */
 /*                                                                   */

             CALL QUSRTVUS (&USRSPC X'00000085' X'00000004' +
                            &BIN4)
             CHGVAR     &LOOP      %BINARY(&BIN4)
             IF         COND(&LOOP = 0) THEN(GOTO CMDLBL(NOJOBS))

 /*                                                                   */
 /* Retrieve list entry length, convert to decimal.                   */
 /* Retrieve list entry offset, convert to decimal, and add one       */
 /* to set the position.                                              */
 /*                                                                   */

             CALL QUSRTVUS (&USRSPC X'00000089' X'00000004' +
                            &ELENB)
             CHGVAR     &ELEN      %BINARY(&ELENB)
             CALL QUSRTVUS (&USRSPC X'0000007D' X'00000004' +
                            &BIN4)
             CHGVAR     &DEC8      %BINARY(&BIN4)
             CHGVAR     VAR(&DEC8) VALUE(&DEC8 + 1)

 /*                                                                   */
 /* Loop for the number of jobs until no more jobs then go to         */
 /* ALLDONE label                                                     */
 /*                                                                   */

 STARTLOOP:  IF (&LOOP = 0) THEN(GOTO ALLDONE)

 /*                                                                   */
 /* Convert decimal position to binary 4 and retrieve list job entry  */
 /*                                                                   */

             CHGVAR     %BINARY(&BIN4)   &DEC8
             CALL QUSRTVUS (&USRSPC &BIN4 &ELENB +
                            &LJOBE)

 /*                                                                   */
 /* Copy internal job identifier and retrieve job information for     */
 /* basic performance information.                                    */
 /*                                                                   */

             CHGVAR     VAR(&INTJOB) VALUE(%SST(&LJOBE 27 16))
             CALL QUSRJOBI (&JOBI X'00000068' 'JOBI0100' +
                            '*INT                      ' +
                            &INTJOB)

 /*                                                                   */
 /* Copy job type and if subsystem monitor, spool reader, system job, */
 /* spool writer, or SCPF system job then loop to next job            */
 /*                                                                   */

             CHGVAR     VAR(&JOBTYPE) VALUE(%SST(&JOBI 61 1))
             IF         COND((&JOBTYPE = 'M') *OR (&JOBTYPE = 'R')  +
                         *OR (&JOBTYPE = 'S') *OR (&JOBTYPE = 'W')  +
                         *OR (&JOBTYPE = 'X')) +
                          THEN(GOTO CMDLBL(ENDLOOP))

 /*                                                                   */
 /* Copy run priority, convert to decimal, convert to decimal 5,0,    */
 /* and if request run priority is less than or equal to the current  */
 /* run priority then loop to next job.                               */
 /*                                                                   */

             CHGVAR     VAR(&RUNPTY4) VALUE(%SST(&JOBI 65 4))
             CHGVAR     &RUNPTY8      %BINARY(&RUNPTY4)
             CHGVAR     VAR(&RUNPTY5) VALUE(&RUNPTY8)
             IF         COND(&RUNPTY5 *GE &RUNPTY) THEN(GOTO +
                          CMDLBL(ENDLOOP))

 /*                                                                   */
 /* Retrieve job name, convert to run priority to character,  change  */
 /* the job run priority and seen message stating the run priority    */
 /* was changed.                                                      */
 /*                                                                   */

             CHGVAR     VAR(&RJOB) VALUE(%SST(&JOBI 9 10))
             CHGVAR     VAR(&RUSER) VALUE(%SST(&JOBI 19 10))
             CHGVAR     VAR(&RNBR) VALUE(%SST(&JOBI 29 6))
             CHGVAR     VAR(&RUNPTYC) VALUE(&RUNPTY)
             CHGVAR     VAR(&RUNPTY5C) VALUE(&RUNPTY5)
             CHGJOB     JOB(&RNBR/&RUSER/&RJOB) RUNPTY(&RUNPTYC)
             MONMSG     MSGID(CPF1343) EXEC(GOTO CMDLBL(ENDLOOP))
             SNDPGMMSG  MSG('Job' *BCAT &RNBR *TCAT '/' *TCAT +
                          &RUSER *TCAT '/' *TCAT &RJOB *BCAT 'run +
                          priority was change from' *BCAT &RUNPTY5C +
                          *BCAT 'to' *BCAT &RUNPTYC *TCAT '.')

 /*                                                                   */
 /* At end of loop set new decimal position to next entry and         */
 /* decrement loop counter by one.                                    */
 /*                                                                   */

 ENDLOOP:    CHGVAR     VAR(&DEC8) VALUE(&DEC8 + &ELEN)
             CHGVAR     VAR(&LOOP) VALUE(&LOOP - 1)
             GOTO       CMDLBL(STARTLOOP)

 /*                                                                   */
 /* Send message that no jobs were found.                             */
 /*                                                                   */

 NOJOBS:     SNDPGMMSG  MSG('No jobs found.')

 /*                                                                   */
 /* All done. Now delete temporary user space that we created.        */
 /*                                                                   */

 ALLDONE:    DLTUSRSPC  USRSPC(QTEMP/&EUSRSPC)
             MONMSG CPF0000
             ENDPGM

可以通过除去 IF 语句来比较当前和请求的运行优先级,从而更改程序以更改运行优先级。

要创建 CL 程序,请指定以下内容:

CRTCLPGM PGM(QGPL/CHGACTJOB) SRCFILE(QGPL/QCLSRC)

您可以将该命令更改为:

  • 指定另一打印机设备。
  • 请指定其他输出队列。
  • 指定 "更改作业" (CHGJOB) 命令可以更改的不同作业属性。
  • 仅列示输出队列上的作业并除去假脱机文件。
  • 提供菜单以选择要更改的作业。