11/15/2013 Update
====================
转一篇我上周在Developerworks上写的文章。文章贴过来之后,格式有点乱了,建议通过原文链接阅读。
原文链接: https://www.ibm.com/developerworks/community/blogs/IBMzOS/entry/20131101?lang=en
Title: z/OS V2R1 New Function: Timeout in Shell Terminal
Keywords: USS,Shell,SMF,Timeout
术语表
TSO: Time Sharing Option
USS: UNIX Systems Service
SMF: System Monitoring Facility
TTY: Teletype, 用来处理用户输入输出的控制台设备。
摘要
本文将介绍z/OS V2R1版本的一个新功能:Shell终端超时自动退出。这个功能可简单描述为: 在Shell终端的等待输入状态下,如果超过了指定时间没有按键输入,终端会话将自动退出。 基于这个功能,系统管理员能统一设置Shell终端的超时时间,防止处于等待状态的Shell终端窗口被非授权用户误用。
背景知识
在V2R1之前的z/OS版本中,USS只提供了环境变量TMOUT来设置Shell终端的超时时间。但系统管理员在/etc/profile统一设置了TMOUT值之后,普通用户还可以通过修改Shell的配置文件.profile重新指定TMOUT,这样便绕过了系统管理的初始超时控制。另外,用户在Shell终端打开OEDIT或vi程序之后,TMOUT作用的计时器会停止计时,Shell终端无法超时退出。所以,USS在V2R1版本中提供了新的系统参数,用来统一指定Shell超时方式,并对在执行OEDIT或vi程序的Shell终端超时退出也提供了支持。
功能介绍
V2R1版本提供了新的Parmlib参数和Shell环境变量用来设置Shell超时退出方式。新的Parmlib参数名称为PWT。
PWT(SMF|SMFENV|ENV)
PWT可以定义BPXPRMxx,该参数设置会影响所有处于等待终端输入状态的USS进程。下面是PWT三个可选参数的说明:
1> PWT参数的默认值是ENV,此时USS进程是否会超时退出由Shell环境变量_BPXK_TIMEOUT决定。
2> PWT的值为SMF时,USS进程的超时时间由进程所在地址空间对应的SMF参数(JWT/TWT/SWT)来指定。JWT/TWT/SWT分别是针对普通作业(Job)、开始任务(Started Task)和TSO/E地址空间的超时值,其中TWT与SWT也是V2R1新引入的SMF参数。如果TWT或SWT没有在SMF中设置,与之对应类型的地址空间超时值将被直接设置为JWT。
3> PWT设定SMFENV之后,USS进程的超时值将由SMF参数(JWT/TWT/SWT)指定,同时也允许Shell用户通过_BPXK_TIMEOUT指定超时方式,_BPXK_TIMEOUT会覆盖PWT的设定值。
为了方便Shell用户设置超时方式,V2R1版本中增加了一个Shell环境变量_BPXK_TIMEOUT:
_BPXK_TIMEOUT=NONE|SMF
_BPXK_TIMEOUT是由USS内核处理的Shell环境变量,它的有效值包括:
空值 - 沿用PWT设置的超时方式。
SMF - 使用SMFPRMxx参数 JWT/TWT/SWT作为超时值
NONE - 禁用Shell终端超时退出功能
_BPXK_TIMEOUT默认值为空。除非在BPXPRMxx指定了PWT参数为SMF,否则_BPXK_TIMEOUT参数将会覆盖PWT的设定值。
除了上文介绍的两个参数,V2R1中还引入新的Unix信号SIGTMOUT[3],SIGTMOUT的功能描述如下表:
信号号称 | 信号值 | 默认行为 | 功能描述 |
SIGTMOUT | 40 | 异常退出 | 终止处于终端等待状态的进程,此信号不能被捕捉或忽略。SIGTMOUT信号为z/OS保留的信号,不能被应用程序使用。 |
当Shell会话超时退出时,USS内核向这个会话中的所有进程(绑定相同的TTY的进程)发送SIGTMOUT信号,进程收到此信号后结束,然后系统会在joblog里输出BPXP023I消息,消息内容包含SIGTMOUT信号的收发线程号和进程号。消息格式如下。
BPXP023I THREAD tttttttttttttttt, IN PROCESS pppppppp, WAS TERMINATED BY
SIGNAL SIGTMOUT, SENT FROM THREAD xxxxxxxxxxxxxxxx, IN
PROCESS ssssssss, UID yyy, IN JOB jobname.
此外,如果一个地址空间中只有一个USS进程存在,那么进程收到 SIGTMOUT信号退出,地址空间也随之结束。地址空间结束之后,系统将在syslog或joblog里输出IEF450I消息,如下所示:
IEF450I WELLIE24 *OMVSEX - ABEND=SEC6 U0000 REASON=0000FF28
操作步骤
上一节介绍了与超时退出功能相关的一些参数,本节将结合这些参数介绍系统的配置操作步骤。
(一) 设置SMF参数。 USS进程的超时值是基于SMF参数(JWT/TWT/SWT)来设定的,所以我们需要先在SMF的Parmlib成员中SMFPRMxx为不同类型的地址空间指定超时值。
JWT(hhmm),
TWT(hhmm),
SWT(hhmm)
上述三个参数的格式一样,前两位为小时计数值,后两位用分钟。保存SMF设置之后,再输入下面的MVS命令,激活刚才设置的SMF参数。
SET SMF=xx
接下来可以输入命令D SMF,O,检查SMF超时值是否设置成功,如下例所示:
D SMF,O
TWT(0100) -- PARMLIB
SWT(0100) -- PARMLIB
JWT(0100) -- PARMLIB
在上述设置中, 三种类型的地址空间的超时值都已设为1小时。
(二)设置PWT参数。PWT参数存放在BPXPRMxx里,我们可以直接修改Parmlib内容,然后用命令“SET OMVS=xx”重新载入OMVS配置;也可以使用SETOMVS命令动态修改PWT的值,如:
SETOMVS PWT=SMF|SMFENV|ENV
PWT设置成功后,可通过D OMVS,O命令看到当前值。
(三)设置_BPXK_TIMEOUT。当PWT的参数值设置为SMFENV或ENV时,系统允许用户在Shell中通过设置环境变量_BPXK_TIMEOUT覆盖系统的设置。在z/OS默认的Shell中,用户通过export命令设置环境变量:
export _BPXK_TIMEOUT=SMF|NONE
在TCSH中,则使用setenv命令设置环境变量:
setenv _BPXK_TIMEOUT SMF|NONE
设置了_BPXK_TIMEOUT变量之后,无论是在默认Shell还是TCSH中,都可以通过env命令验证_BPXK_TIMEOUT的当前值:
env|grep _BPXK_TIMEOUT
至此,我们已经完成了Shell超时退出功能的配置,接下来可以试着在OMVS中输入一个命令如ftp,或者通过SSH登陆Shell,打开一个vi,等待设定的时间,Shell终端将自动退出。 此外,为了方便统一配置,系统管理员可以在/etc/profile、/etc/csh.cshrc和/etc/csh.login等Shell配置文件中指定_BPXK_TIMEOUT的值,这样普通用户登录进入Shell终端后,系统会自动载入_BPXK_TIMEOUT变量。
注意事项
用户在TSO环境进入到OMVS Shell并且PWT被设置为SMF,由于Shell进程默认会在TSO用户的地址空间中创建,Shell进程所在的地址空间为TSO类型,Shell超时值将取决于TWT参数。进一步,用户在OMVS环境中再打开OEDIT窗口,OEDIT程序会创建自己的地址空间,OEDIT所在地址空间为作业(JOB)类型,其超时值取决于JWT参数。所以,此时Shell环境存在两类地址空间,超时值也同时取决于TWT与JWT参数。在这种情况下,当TWT参数小于JWT参数时,TSO会话会先超时退出,OMVS环境也会随之结束;当JWT参数小于TWT参数时,OMVS环境会先于TSO超时退出,OMVS退出之前结束已打开的OEDIT程序。
在z/OS V2R1版本中,除了新引入PWT、_BPXK_TIMEOUT参数,原有的Shell环境变量TMOUT也能指定Shell终端的值。当在系统中同时设置了PWT和TMOUT参数,TMOUT只有在比SMF指定的超时值更小的情况下才会起作用。例如,SMFPRMxx中设置JWT=(0010)(10分钟),在BPXPRMxx中设置PWT=SMF(超时时间由JWT指定),然后再在Shell中设置TMOUT=300(5分钟)。TMOUT小于JWT,TMOUT将作用于Shell终端,使之在等待5分钟后退出。
此外,PWT和_BPXK_TIMEOUT参数设置的超时方式只会影响在Shell前台等待TTY输入的进程。如果USS进程处于内核等待状态,例如运行sleep命令挂起进程,或者前台进程等待IO输入输出(读写文件、socket),这样的进程将不能被超时退出。
结束语
本文先介绍了z/OS V2R1版本中的shell终端超时退出功能的主要特性,如支持vi/oedit编辑器的超时退出、提供了新的全局参数设置超时方式; 然后描述了相关的系统配置步骤;最后对使用过程中可能出现的几类问题进行了说明。通过阅读本文,z/OS系统管理员能学习到如何统一管理Shell终端的超时时间,从而提高z/OS系统的安全性。普通用户也能了解怎样在Shell环境指定超时方式,以防止自己的Shell终端被非授权用户误用。
参考文档
[1] SA23-1380-00: z/OS MVS Initialization and Tuning Reference
[2] SA23-2279-00: z/OS UNIX System Services Planning
[3] SA23-2281-00: z/OS UNIX System Services Programming Assembler Callable Service