天天看点

AIX服务详解(原创)

AIX服务概述

在Windows中,服务标志着一个组件、一套应用、一套进程结构,这是大家所熟悉的。在AIX中也有类似Windows系统的组成构件。随着AIX的启动,各种在AIX中定制的子系统、子服务、系统组也会被启动。子系统、子服务、子系统组这三个概念之间的关系如下:

AIX将各种功能以组的形式体现,称之为子系统(Subsystem)。一个子系统就是可以通过控制系统操作的一个或一组程序或进程的集合,用来提供某类指定的功能,例如ypsery、dhcpsd 、xntpd、inetd、syslogd、sendmail等。

可再将子系统提供的服务细分为子服务(Subserver)。一个子服务是属于某个子系统的程序或进程,若干子服务可以构成一个子系统。

可以将若干具有相关性功能的子系统编制为子系统组(Subsystem Group),这是SRC可以管理的最高层次。

子系统组、子系统、子服务按照层次结构组织,构成了AIX的“服务”体系。下图所示为一个子系统组tcpip及其包含的几个子系统,其中inetd子系统又包含了若干子服务。

系统资源控制器

在AIX中,系统资源控制器(System Resource Controller,SRC)用来管理子系统。SRC拥有若干命令,用来查看(lssrc)、关闭(stopsrc)、启动(startsrc)、刷新子系统(refresh)。例如,可以使用lssrc-a命令查看当前运行的系统中子系统的活动情况,其中没有进程号的处于未启动状态。

lssrc

用途

获取子系统、子系统组或子服务器的状态。

描述

lssrc 命令发送请求到“系统资源控制器”以获取子系统、子系统组或所有子系统上的状态。lssrc 命令发送子系统请求包到守护程序,守护程序接着转发给子系统以获取子服务器状态或长型子系统状态。

lssrc 命令的输出结果有时可以为特殊的守护程序显示两项实例。一个实例是活动的,而另一个实例却是不起作用的。如果在不停止子系统的情况下修改子系统(使用 mkssys 命令或 chssys 命令),那么可能会发生这种情况。原始子系统保持活动,但已修改的实例还不起作用,直到子系统停止并重新启动。

标志

-a 列出所有已定义的子系统的当前状态。
-d 指定打印缺省记录。
-g  指定要获取状态的子系统组。如果子系统对象类中不包含  GroupName  
-h  指定请求状态操作的外部主机。本地用户必须以“root 用户”运行。远程系统必须配置接受远程“系统资源控制器”请求。即  srcmstr   守护程序(请参阅  /etc/inittab )必须已启动  -r   标志以及  /etc/hosts.equiv   或.rhosts  
-l 请求子系统以长格式发送它的当前状态。长状态要求发送一个状态请求到子系统;返回该状态是子系统的职责。
-nNotifyName 指定一个通知方法的名称。
-N 指定以 SMIT 格式输出“对象数据管理器”(ODM)的通知对象类记录。
-o  指定将子服务器  Object  
-p  指定要获取其状态的  SubsystemPID  
-P  指定一个  SubserverPID  
-sSubsystem 指定一个获取状态的子系统。Subsystem   变量可以是子系统的真实子系统名或同义名。如果子系统对象类中不包含  Subsystem  
-S 指定以 SMIT 格式输出子系统对象类的 ODM 记录。
-t  请求子系统发送子服务器的当前状态。如果子服务器对象类中不包含  Type  
-T 指定以 SMIT 格式输出子服务器对象类的 ODM 记录

示例

要获取本地机器上所有子系统的状态,请输入:

lssrc  -a

本命令获取本地机器上已知的所有子系统的状态。

要获取外部主机上的所有子系统的状态,请输入:

lssrc  -h zork  -a

本命令获取 zork 机器上已知的所有子系统的状态。

获取 srctest 子系统的状态,请输入:

lssrc  -s srctest

本命令获取本地机器的 srctest 子系统上的所有实例状态。

要使用 PID 获取子系统状态,请输入:

lssrc  -p 1234

本命令获取本地机器上 PID 为 1234 的子系统的状态。

要获取 tcpip 子系统组的状态,请输入:

lssrc  -g tcpip

本命令获取本地机器上 tcpip 组中子系统的所有实例的状态。

要获取 tester 子服务器的状态,请输入:

lssrc  -t tester  -p 1234

本命令获取 tester 子服务器上属于 srctest 子系统中 PID 为 1234 的子系统的状态。

要使用 PID 获取子系统状态,请输入:

lssrc  -l  -p 1234

本命令获取 PID 为 1234 的子系统的长状态。​

startsrc

用途

启动子系统、子系统组或子服务器。

描述

startsrc 命令向系统资源控制器(System Resource Controller, SRC)发送请求以启动子系统或子系统组,或向启动子服务器的子系统发送一个信息包。

如果启动子服务器的请求发送到 SRC,且该子服务器所属的子系统当前不活动,那么 SRC 会启动子系统,并将启动子服务器的请求发送给子系统。

示例

-a  指定子系统执行时传递给子系统的自变量字符串。该字符串从命令行发送,并附加在子系统对象类中的命令行自变量上。指定的  Argument  
-e 

当子系统执行时,指定一个放入子系统环境中的环境字符串。指定的  Environment   字符串的最大长度为 1200 个字符,否则命令将失败。使用与 shell 所使用的相同的规则,SRC 为子系统设置环境。

引号引起的字符串指定给一个单一的环境变量,并且引号引起的字符串外的空格定界了每个要设置的环境变量。例如,-e "HOME=/tmp TERM=dumb MESSAGE=\"Multiple word message\""   将  HOME=/tmp   设置为子系统第一个环境变量,将  TERM=dumb   设置为子系统第二个环境变量,将  MESSAGE="Multiple word message"  

-g  指定一组要启动的子系统。如果  Group  
-h  指定在其上请求此启动操作的外部主机。本地用户必须作为“root”用户运行。必须配置远程系统以接受系统资源控制器的请求。也就是说,srcmstr   守护程序(请参阅  /etc/inittab )必须用  -r   标志启动,并且必须配置/etc/hosts.equiv   或  .rhosts  
-o  指定子服务器对象作为字符串传递给子系统。确定  Object  
-p  指定启动子服务器请求要发送到的子系统的特定实例。
-s   Subsystem 指定要启动的子系统。Subsystem   可以是实际的子系统名,或子系统的同义词名称。如果  Subsystem  
-t  指定要启动的子服务器。如果子服务器对象类中未包含  Type ,命令将失败。

示例

要使用参数和环境变量启动一个子系统,请输入:

startsrc  -s srctest  -a "-D DEBUG"  -e "TERM=dumb HOME=/tmp"

这将使用其环境中的 "TERM=dumb" 、"HOME=/tmp"并且将 "-D DEBUG" 作为该子系统的两个参数来启动 srctest 子系统。

要启动外部主机上的子系统组,请输入:

startsrc  -g tcpip  -h zork

这将启动 zork 机器上 tcpip 子系统组中所有的子系统。

要启动一个子服务器,请输入:

startsrc  -t tester

这将向拥有 tester 子系统的子系统发送启动子服务器的请求。

要使用命令参数启动一个子系统,请输入:

startsrc  -s srctest  -a "-a 123 -b \"4 5 6\""

这将使 "-a" 作为 srctest 子系统的第一个参数,"123" 作为第二个参数,"-b" 作为第三个参数,而 "456" 作为第四个参数。

stopsrc

用途

停止子系统、子系统组或子服务器。

描述

stopsrc 命令向系统资源控制器(SRC)发送要求停止一个子系统、一组子系统或所有子系统的请求。stopsrc 命令向系统资源控制器发送子系统请求包,该请求包转发至子系统用于停止子服务器的请求。

如果没有 -f(强制停止)标志, 则假设为正常的停止操作。正常停止要求子系统或子服务器完成所有当前处理,在所有应用程序活动完成时释放资源,然后结束。子系统不再接受任何新的工作请求。

强制停止要求子系统或子服务器迅速结束,释放所有资源,但不等待应用程序活动完成。

取消操作是在子系统的资源释放后以及一段宽延时间后才停止子系统。此宽延时间在子系统的对象类中指定。取消停止只用于子系统的停止,并且总是以 SIGTERM 信号发送给子系统。子系统抓取这个信号,执行子系统清除操作,然后结束。如果子系统没有在等待时间内结束(等待时间在子系统对象类中指定),那么将 SIGKILL 信号发送给子系统以确保子系统的停止。

如果子系统使用套接字或消息队列进行通信,那么构造一个数据包并发送给子系统。如果子系统使用信号进行通信,那么将子系统对象类中的适当的信号发送给子系统。 标志

-a 指定停止所有子系统。
-c 指定停止请求是已取消的停止请求。对于取消停止请求,将  SIGTERM   信号发送到子系统。在子系统对象类中指定的等待时间过去后,如果子系统仍未停止,那么将  SIGKILL  
-f 指定强制停止请求。
-g  指定停止一组子服务器。如果  Group  
-h  指定请求该停止操作的外部  Host   机器。本地用户必须作为“root”用户运行。必须配置远程系统以接受系统资源控制器的请求。即  srcmstr   守护程序(请参阅  /etc/inittab )必须用  -r   标志启动,并且必须配置/etc/hosts.equiv   或  .rhosts  
-o  指定子服务器  Object  
-p  指定要停止的子系统的特定实例,或子服务器(停止子服务器请求要传递到该子系统)的特定实例。
-P  指定子服务器 PID 是作为字符串传递给子系统的。
-s  指定要停止的子系统。Subsystem   参数可以是实际的子系统名称或子系统的同义词名称。stopsrc   命令停止所有当前活动的子系统实例。如果  Subsystem  
-t  指定要停止的子服务器。如果子服务器对象类中未包含指定的  Type ,stopsrc  

示例

要在外部主机上强制停止一个子系统,请输入:

stopsrc  -h zork  -s srctest  -f

这将强制停止 zork 机器上的 srctest 子系统的所有实例。

要取消停止一个子系统组,请输入:

stopsrc  -g tcpip  -c

这将在 tcpip 组的所有子系统上激活停止取消。

要停止一个子服务器,请输入:

stopsrc  -t tester  -p 1234

这将停止 tester 子服务器,它属于子系统 PID 为 1234 的 srctest 子系统。

要停止所有子系统,请输入:

stopsrc  -a

这将停止本地机器上所有活动的子系统。

refresh

用途

请求子系统或子系统组的刷新。

描述

refresh 命令发送一个转发到该子系统的子系统刷新请求给系统资源控制器。刷新操作依赖于子系统。

注意:如果子系统的通信方法是信号,refresh命令失败。

标志

-g  指定一组要刷新的子系统。如果  Group   名称不包含在子系统对象类中,refresh  
-h  指定外部的  Host   机器,在该机器上请求刷新操作。本地用户必须作为“root”用户运行。 必须配置远程系统以接受远程系统资源控制器请求。就是说,srcmstr   守护程序(参阅  /etc/inittab )必须以  -r   标志启动,并且必须配置  /etc/hosts.equiv   或  .rhosts  
-p  指定特定的要刷新的子系统实例。
-s  指定要刷新的子系统。Subsystem   名称可以是实际的子系统名称或者子系统的同义名称。 如果  Subsystem   名称不包含在子系统对象类中,refresh  

示例

要刷新组,比如 tcpip,请输入:

refresh  -g tcpip

要刷新子系统,比如 xntpd,请输入:

refresh  -s xntpd

服务相关

相关文件

/etc/objrepos/SRCsubsys 指定 SRC 子系统配置对象类。
/etc/objrepos/SRCsubsvr 指定 SRC 子服务器配置对象类。
/etc/services 定义用于因特网服务的套接字和协议。
/dev/SRC 指定  AF_UNIX  
/dev/.SRC-unix 指定临时套接字文件位置。

查看SRC服务

$ps -ef|grep srcmstr

    frp 618582 931544  0 15:00:09 pts/3 0:00 grep srcmstr

   root  58126      1  0  Jun 01     - 0:13 /usr/sbin/srcmstr

$grep srcmstr /etc/inittab

srcmstr:23456789:respawn:/usr/sbin/srcmstr # System Resource Controller

查看ODM库中子服务信息

 $odmget SRCsubsvr

SRCsubsvr:

       sub_type = "ftp"

       subsysname = "inetd"

       sub_code = 21

SRCsubsvr:

       sub_type = "uucp"

       subsysname = "inetd"

       sub_code = 540

SRCsubsvr:

       sub_type = "telnet"

       subsysname = "inetd"

       sub_code = 23

SRCsubsvr:

       sub_type = "shell"

       subsysname = "inetd"

       sub_code = 514

SRCsubsvr:

       sub_type = "login"

       subsysname = "inetd"

       sub_code = 513

SRCsubsvr:

       sub_type = "exec"

       subsysname = "inetd"

       sub_code = 512

SRCsubsvr:

       sub_type = "finger"

       subsysname = "inetd"

       sub_code = 79

SRCsubsvr:

       sub_type = "tftp"

       subsysname = "inetd"

       sub_code = 69

查看ODM库中子系统定义

 $odmget SRCsubsys |more

SRCsubsys:

       subsysname = "inetd"

       synonym = ""

       cmdargs = ""

       path = "/usr/sbin/inetd"

       uid = 0

       auditid = 0

       standin = "/dev/console"

       standout = "/dev/console"

       standerr = "/dev/console"

       action = 2

       multi = 0

       contact = 3

       svrkey = 0

       svrmtype = 0

       priority = 20

       signorm = 0

       sigforce = 0

       display = 1

       waittime = 20

       grpname = "tcpip"

SRCsubsys:

       subsysname = "sshd"

       synonym = ""

       cmdargs = "-D"

       path = "/usr/sbin/sshd"

       uid = 0

       auditid = 0

       standin = "/dev/console"

       standout = "/dev/console"

       standerr = "/dev/console"

       action = 1

       multi = 0

       contact = 2

       svrkey = 0

       svrmtype = 0

       priority = 20

       signorm = 15

       sigforce = 9

       display = 1

       waittime = 20

       grpname = "ssh"

继续阅读