第4章 常用的MVS主控台命令
在主机行业,以前的分工是非常细的,大体上根据工作的职责可以分为:
● 系统维护员:负责主机系统的安装、参数设置、系统配置和系统性能调优等。
● 系统操作员:负责主机系统的日常操作、运行和监控。
● 应用程序员:根据用户需求,设计和编写应用系统要求的程序,并负责应用系统的安装和维护。
我们这里介绍的主控台命令,都是一些常用的帮助系统开发或维护人员了解自己工作的系统的一些工具。你可以在几个不同的地方使用主控台命令。
● 主控台:一般放置在主机房中,只有系统操作员可以使用它们。主控台上可以直接输入命令,比如,你想显示当前正在运行的作业、TSO用户和STC任务,你可以直接输入命令:D J。
● LOG界面:系统维护员和有权限的应用程序员都可以通过TSO SDSF中的LOG界面使用主控台命令,不过在输入命令的前面必须加一个斜杠(/)。比如,你想显示当前正在运行的作业、TSO用户和STC任务,你可以在LOG界面输入命令:/D J。
● ULOG界面:跟LOG界面类似,只是它显示的只有该用户本身所执行命令的信息。如果在ULOG界面上输入主控台命令,也需要在输入命令的前面加一个斜杠(/)。
下面我们会分别介绍JES2命令和MVS命令。因为JES2是MVS系统下面的一个最重要的子系统,管理系统中的所有作业,是每个人需要知道的。
4.1 JES2命令
正如我们在前面介绍的,作业进入系统(Job Entry Subsystem——JES)是MVS的一个组成部分,用来管理作业的运行轨迹,包括选择作业进入系统、交付MVS处理和将作业的输出结果发送到正确的目的地即打印机的整个过程。目前MVS中使用的JES系统有JES2和JES3,我们这里介绍的命令都是适用于JES2的。
4.1.1 $D JOB显示特定作业(JOB)的信息
$D JOB命令用来显示它的作业的下列信息。
● 作业编号。
● 作业名。
● 作业状态。
● 作业类别。
● 作业优先级。
● 作业所在的缓冲区(Spool)卷。
4.1.1.1 显示作业的输出信息
命令$d j43,long用来显示作业号为43的作业的详细信息,图4.1是该命令的执行结果。从图中我们可以看到,作业的编号为JOB00043,这是系统为每个提交上来的作业编的一个唯一的编号,一个作业如果提交多次,每次系统都会给一个不同的编号。
作业的名字为CREATWRK,它所运行的分区(Class)为A,优先级(Priority)为1,其当前的状态为等待输出(AWAITING HARDCOPY)。该作业是由用户(UserID)IBMUSER提交的,其运行的缓冲区(Spool)所在的卷为DMTCAT,该作业一共有11 行JCL语句(CARDS),它执行后的返回码(CC)为JCLERROR。
图4.1 命令$d j43,long执行后的结果
在系统中,作业编号是用数字表示的,而作业名则可以由字母和数字表示,但第1个字符不能为数字,这样系统就能区分你给它的信息是作业号还是作业名。下面我们给大家更多的例子。
如果要显示作业号为13的作业状态,可以使用命令$D J13。如果要显示作业名以IBM开头的作业的状态,可以使用命令$D J1-*,JM=IBM*,其中,J1-*表示从作业号1到最大值(*)的所有作业,JM表示作业名(JOB NAME),IBM*表示以IBM开头的所有作业名,星号(*)是通配符。
如果要显示你的系统中所有作业的状态,可以在主控台使用命令$D J,All或D J,LONG。如果要显示作业名第2位到第4位为IBM的作业状态,可以使用的命令为$D J,JM=?IBM*,LONG,其中,问号(?)也是通配符,代表任何一个字符。如果要显示作业号为2 到100 的所有作业,可以使用的命令是$D J2-100。
4.1.1.2 显示使用缓冲区(SPOOL1)超过1%的作业信息
系统有时候可能出现JES2 SPOOL满了的情况,这时用户无法登录系统,你必须通过MVS主控台命令来删除一些作业输出。在你输出作业之前,必须找到那些占据了比较多SPOOL空间的作业。
下面的命令显示占据SPOOL空间超过1%的作业:$D JQ,SPOOL=(V=SPOOL1,PERCENT)1),系统会显示类似于下面的信息。
从系统显示中我们可以看到,作业JOB00007,作业名为MYJOB,占据了1.1428%的缓冲区,同样,另外一个作业JOB00018,作业名为MYJOB2,也占据了1.1428%的缓冲区,它们是导致SPOOL满的主要原因,必须使用后面介绍的$P命令将它们从系统中删除,才能解决缓冲区满的问题。
4.1.1.3 $D STC查看已启动任务的作业号和状态
命令$D STC‘CICSAOR1’用来查看作业CICSAOR1是否已经启动,其执行的结果如图4.2所示。
4.1.1.4 显示系统中的TSU用户及其作业号
命令$D JQ,CLASS=TSU用来显示系统中所有的TSO用户及其作业号,其执行结果如图4.3所示。
图4.2 命令$D STC‘CICSAOR1’执行后的结果
图4.3 命令$D JQ,CLASS=TSU执行后的结果
4.1.2 $D SPOOL显示缓冲区(Spool)的状态
命令$D SPOOL显示系统缓冲区的使用情况。它能帮助我们监控缓冲区的使用情况,并根据SPOOL的使用情况,采取对应的动作,以提高系统的性能。
显示系统中所有的缓存区及使用百分比和总的缓冲区使用百分比
命令$D SPL用来显示系统中正在使用的缓冲区的状态,包括缓冲区的卷名、状态和使用百分比。图4.4显示的是我们当前系统的缓冲区状态。我们可以看到,缓冲区的卷名(Volume)为DMTCAT,状态(Status)为活动的(Active),缓冲区使用的百分比为4.3000%。
图4.4 命令$D SPL执行后的结果
4.1.3 $DA显示系统中所有活动的作业的状态
命令$D A用来显示下面各类作业的信息。
● 活动的批处理作业(Batch job)。
● 活动的已启动任务(Started Task——STC)。
● 活动的TSO用户(TSU)。
4.1.3.1 显示系统中所有活动作业的状态
图4.5 是命令$D A的执行结果,它显示了系统在当前正在运行的作业为JOB00037,作业名为IBMUSER,该作业的运行分区(Class)为A,优先级为6,作业状态为正在运行。
4.1.3.2 显示特定设备上所有活动作业的状态
图4.6是命令$D A,ALL,V=DMTCAT的执行结果,它显示了当前在设备DMTCAT上正在运行的作业为JOB00037,作业名为IBMUSER,该作业的运行分区(Class)为A,优先级为6,作业状态为正在运行。
图4.5 命令$D A执行后的结果
图4.6 命令$D A,ALL,V=DMTCAT的执行结果
4.1.4 $D U显示JES2控制的设备的状态
命令$D U用来显示JES2控制的特定设备的信息,如果有作业在该设备上运行,也会显示该作业的信息。图4.7 是使用命令$DU,LINE1返回的结果,它显示了设备LINE1的状态。
图4.7 命令$DU,LINE1返回的结果
4.1.5 $D I显示JES中初始器(Initiator)的状态
命令$D I用来显示系统中定义的所有初始器的状态及分配给每个初始器的作业类别(Class)。初始器是MVS下面的一个程序,用来完成对作业的管理。在整个作业的运行过程中,它扮演了非常重要的角色。它的工作流程为:
1.在作业缓冲区(Spool)中,根据作业的类别(Class)和优先级选择要执行的作业。
2.为执行的作业分配数据集并执行所有的作业步。
3.将作业产生的输出释放到输出队列中。
4.重复上面的步骤直到缓冲区中的所有作业执行完。
对于每个作业,初始器完成的具体工作有:
1.对每个作业步,初始器调用系统的分配例程(Allocation Routines)为作业步需要的数据集分配设备和卷。
2.在作业步的资源分配完成后,初始器为作业建立一个用户区域(Region),将用户程序调入到该用户区域中并将控制权交给用户程序。
3.当用户程序执行完后,初始器调用系统重分配例程(Unallocation Routines)释放作业步占据的资源。然后,如果作业有多个作业步,初始器就会重复上面的分配—运行—释放过程,直到所有的作业步执行完毕。
4.作业的输出处理完后,初始器会将作业使用的缓冲区(Spool)空间释放出来供其他作业使用,并将为该作业建立的控制块删除掉。
4.1.5.1 显示JES中所有的初始器(Initiator)所定义的分区和状态
图4.8是$D I命令输出结果的一部分,实际上,你在ISPF的TSO SDSF INIT界面上已经见过类似的画面。它告诉我们系统已经定义好所有初始器的名字、状态和指定给该初始器上的作业类别(Class)。
从该命令的输出中我们可以看到,整个系统定义了12个初始器,它们的状态和指定的分区分别是:
图4.8 命令$D I输出结果的一部分
Initiator(1)状态为:INACTIVE,可在该初始器上运行的作业分区为:a。
Initiator(2)状态为:INACTIVE,可在该初始器上运行的作业分区为:b和a。
Initiator(3)状态为:INACTIVE,可在该初始器上运行的作业分区为:c、b和a。
Initiator(4)状态为:INACTIVE,可在该初始器上运行的作业分区为:d、c、b和a。
Initiator(5)状态为:INACTIVE,可在该初始器上运行的作业分区为:d、c、b和a。
Initiator(6)状态为:DRAINED,可在该初始器上运行的作业分区为:d、c、b和a。
Initiator(7)状态为:INACTIVE,可在该初始器上运行的作业分区为:d、c、b和a。
Initiator(8)状态为:INACTIVE,可在该初始器上运行的作业分区为:d、c、b和a。
Initiator(9)状态为:INACTIVE,可在该初始器上运行的作业分区为:i。
Initiator(10)状态为:INACTIVE,可在该初始器上运行的作业分区为:i。
Initiator(11)状态为:INACTIVE,可在该初始器上运行的作业分区为:t。
Initiator(12)状态为:DRAINED,可在该初始器上运行的作业分区为:t。
4.1.5.2 显示Initiator 3的详细信息
命令$D I3用来显示初始器3的信息,图4.9是命令的执行结果:
图4.9 命令$D I3执行的结果
从结果中我能看到,这个Initiator的状态是INACTIVE,分配到的区为c、b和a,名字为3,目前有一个作业STC00012在上面运行,该作业是一个已启动的任务(Started Task),该任务的编号为12,它的地址空间(Address Spaces)标识(ASID)为26。
4.1.6 $D Q显示系统中所有的队列中的作业信息
命令$D Q显示特定队列上的作业的个数及系统缓冲区使用百分比。
4.1.6.1 显示系统中所有的队列中的作业信息
图4.10显示的$D Q命令的输出结果。我们可以看到,系统中有一个缓冲区(7490),该缓冲区的执行队列(XEQ)上有4个作业等待执行,整个缓冲区的使用百分比为4.2%。
4.1.6.2 显示缓冲区中所有挂起(Hold)作业的信息
命令$D Q,V=DMTCAT,Q=HOLD用来查看磁盘卷DMTCAT上的缓冲区上的挂起作业的状况,从图4.11中显示的信息我们知道,目前有4个作业在缓冲区7490上挂起,缓冲区卷DMTCAT上的缓冲区7490目前的使用百分比是29%。
图4.10 命令$D Q的输出结果
图4.11 命令$D Q,V=DMTCAT,Q=HOLD执行的结果
4.1.7 $C JOB取消作业、TSO用户和STC
$C JOB命令可以用来:
● 取消(Cancel)当前正在运行的作业或当前活动的TSO用户。
● 取消(Cancel)当前正在等待运行的作业、STC或TSO用户。
● 取消(Cancel)作业、STC或TSO用户的输出。
命令$C J36 用来取消正在运行的作业JOB00036,图4.12 是命令执行后的结果。我们看到,作业JOB00036 的作业名为IBMUSERG,该作业目前等待输出,它的CLASS为I,优先级为6,已被取消(CANCEL=YES)。
如果你想取消作业35到40,作业名为IBM开头的作业,可以使用命令$C JOB35-40,JM=IBM*;如果你想取消作业15同时删除所有的输出,可以使用命令$C JOB15,PURGE。
4.1.8 $A A释放系统中所有挂起的作业
命令$A A用来释放所有被命令$H A挂起的作业,图4.13是命令执行后的界面。
图4.12 命令$C J36执行的结果
图4.13 命令$A A执行后的结果
4.1.9 $A JOB释放挂起的作业
$A JOB命令用来释放原来用下列命令挂起的作业。
● $G H命令。
● $H A命令。
● $H JOB命令。
● /* SETUP控制语句。
● $T Nn, H=JR命令。
● $T RDRn, H=Y命令。
● TYPRUN=HOLD JCL参数。
4.1.9.1 释放作业34到40
命令$A J34-40用来挂起作业编号从34到40的作业,图4.14是命令执行的结果,我们看到,原来挂起的作业36到40现在都释放出来了(HOLD=NONE)。
4.1.9.2 释放作业号为10到15的所有批处理作业、STC和TSU用户
命令$A STC00051用来释放已启动任务STC00051,图4.15是该命令的执行结果。我们从该界面中可以看到,它所对应的是我们的CICSAOR1,其优先级为15,作业名为CICSAOR1,命令执行完后,作业的状态已经释放了(HOLD=NONE)。
图4.14 命令$A J34-40执行后的结果
图4.15 命令$A STC00051执行的结果
如果你想释放作业号为10到15的所有批处理作业、STC和TSU用户,可以使用命令$A JQ10-15。
4.1.10 $H A暂停系统中的所有的作业
命令$H A用来暂停系统中所有的作业。图4.16是命令执行后的界面:
命令$H A,7490暂停设备7490上的所有作业,图4.17是命令执行后的界面。
图4.16 命令$H A执行的结果
图4.17 命令$H A,7490执行的结果
4.1.11 $H JOB暂停特定的作业
$H JOB命令用来将特定的作业置为挂起状态。
4.1.11.1 暂停作业10开始的所有作业
命令$H J10-*暂停从作业10开始的所有作业,图4.18是命令执行后的结果。从界面中我们可以看到,作业36到40的5个作业被挂起了。
4.1.11.2 暂停作业STC00051
$H STC00051将我们的CICSAOR1挂起,因为它的STC作业编号为51。图4.19是命令执行后的结果。
图4.18 命令$H J10-*执行的结果
图4.19 命令$H STC00051执行后的结果
4.1.12 $S I启动初始器(Initiator)
命令$S I用来启动一个或多个初始器,让它们开始选择作业执行。
4.1.12.1 将初始器Initiator 5从DRAINED状态变成INACTIVE状态
命令$S I5将初始器I5从不工作状态(DRAINED)激活变成工作状态(INACTIVE),当有作业的CLASS满足它所定义的类别时,该初始器就会变成ACTIVE并开始作业的处理。图4.20是命令执行后的结果,我们可以看到,它的状态已经变成INACTIVE了。
4.1.12.2 启动Initiator 8到10
命令$S I8-10用来启动初始器8到10,图4.21是命令执行后的结果。命令执行完后,它们的状态全部变成INACTIVE了。你也可以看到它们所支持的分区,比如,初始器8支持的类别为D、C、B和A,而初始器9和10只支持分区I。
图4.20 命令$S I5执行后的结果
图4.21 命令$S I8-10执行后的结果
4.1.13 $S XEQ让JES2开始从QUEUE中选择作业执行
命令$S XEQ使得JES2和WLM管理的初始器开始从缓冲区中选择作业运行。图4.22是命令执行完后的界面。
图4.22 命令$S XEQ执行后的结果
4.1.14 $P JES2停止JES2的处理
命令$P JES2用来停止JES2系统。命令执行完后,系统会显示类似下面的信息。
4.1.15 $P I停止特定的初始器
命令$P I用来停止特定的初始器并释放其占据的系统资源。如图4.23所示的命令停止初始器3的工作,即将其状态变为DRAINED。
图4.23 命令$P I执行后的结果
4.1.16 $P O Job清除作业的输出信息
命令$P O Job用来删除特定作业的输出并从系统中输出与其输出相关的痕迹(Traces)。
4.1.16.1 删除作业IBMUSERN的输出信息
命令$P O J‘IBMUSERN’用来删除作业名为IBMUSERN的作业的输出。图4.24是命令执行后的界面:
4.1.16.2 将class A和B中的所有作业输出删除掉
命令$P O JQ,Q=AB将类别为A和B的作业的输出删除掉。图4.25是命令执行后的结果。
图4.24 命令$P O J‘IBMUSERN’执行后的结果
图4.25 命令$P O JQ,Q=AB执行后的结果
4.1.16.3 解决JES2缓冲区(SPOOL)满的问题
有些时候可能出现JES2 SPOOL满了的情况,用户无法登录系统,只能通过MVS Console来删除一些作业输出,下面是几种常用的方法。
1.删除作业1到9999,命令为$PJ1-9999。
2.删除在SPOOL中超过7天的所有作业,命令为$PJOBQ,days>7。
3.删除占用SPOOL空间超过1%的所有作业,命令为$PJOBQ,SPOOL=(PERCENT>=1)。
4.首先找到占用SPOOL空间超过1%的所有作业,其命令为$DJQ,SPOOL=(PERCENT>=1),找到相关的作业后,就可以将它删除掉。比如,如果显示作业MYJOB超过1%,就可以使用下面的命令删除这个作业$PJ‘MYJOB'。
4.1.17 $T JOB修改作业的类别和优先级
$T JOB命令用来修改作业的类别(Class)和优先级等。
4.1.17.1 将作业45的运行CLASS改为X
命令$T J45,C=X将作业45的运行类别改成X。图4.26是命令执行完后的界面,我们可以看到,作业45(作业名为COPYWRK)的类别已经改成X了。
4.1.17.2 将作业45的优先级加2
从图4.27我们可以看到,作业45的优先级现在跟其他作业一样都是6,按照用户的要求,我们要将作业45的优先级调高到8,使得它可以早点执行。
图4.26 命令$T J45,C=X执行后的结果
图4.27 作业45的初始状态
命令$T J45,P=+2就能帮我们完成这项功能。图4.28是命令执行后的界面,我们可以看到,该作业的优先级已经是8了。
我们回到原来的SDSF界面,如图4.29所示,就可以看到,它的优先级已经改成8了。
图4.28 命令$T J45,P=+2执行后的结果
图4.29 作业45的最新状态
4.1.17.3 将执行队列中用户为IBMUSER的作业的运行CLASS改为Y
命令$T JQ,/USERID=IBMUSER,/Q=XEQ,CLASS=Y用来将执行队列(XEQ)中用户名为IBMUSER提交的作业的类别全部改成Y。图4.30是命令执行后的结果。
4.1.17.4 将执行队列中运行CLASS为Y的作业的CLASS改为A
命令$T JQ,/Q=XEQ,/C=Y,C=A用来将执行队列(XEQ)中原来类别为Y的作业全部改成A,图4.31是命令执行后的界面,我们可以看到,有几个作业已经改过来了。
图4.30 命令$T JQ,/USERID=IBMUSER,/Q=XEQ,
图4.31 命令$T JQ,/Q=XEQ,/C=Y,C=A执行后的结果
CLASS=Y执行后的结果
回到SDSF界面,如图4.32所示,就可以看到,所有满足条件的作业的类别已经改成A了。
图4.32 修改作业类别后的最新状态