qnx slm7.0(程序员开发手册-翻译)

原文:icon-default.png?t=M0H8http://www.qnx.com/developers/docs/7.0.0/index.html#com.qnx.doc.neutrino.utilities/topic/s/slm.html

全拼:System launch and monitor(系统启动和监控)启动复杂应用的进程必须按照特定的顺序。

语法

slm [-avV] [-D debug_mode] [-n subsystem_path] [-p priority]

[-P search_path] [-r recovery_mode] [-R frequency/sec|min|hour]

[-s comp_name] [-t polling_interval] [-T total_wait]

[-x comp_name] config_file

运行环境

QNX Neutrino

选项:

-a

采用正在运行的守护进程。使用此选项可以将SLM与某个可能已经在运行某些服务器进程的现有系统集成。如果在配置文件中放置所有相关系统进程的组件项,SLM将在启动时采用这些进程,就像它自己启动它们一样(因此可以通过命令接口控制这些进程,或者在它们异常终止时自动重启它们;参见“正常与异常终止”)。

-D debug_mode

指定何时使用SLM:debug参数列表(而不是普通的SLM:args列表)。其中之一:cmd(默认),startup,或always。使用cmd,调试列表只在模块使用slmctl和-d启动时使用。对于startup,在startup时启动的所有组件(参见-s选项)最初使用调试列表,但随后重启时使用-d选项。如果使用always,则总是使用调试列表。

-n subsystem_path

设置客户端应用程序写入控制和查询命令的接入点(默认为/dev/slm)。

-p priority

设置SLM服务器线程的优先级(默认为30)。

-P search_path

设置可执行文件的搜索路径(默认为$ path)。当启动进程时,如果相应的命令元素不包含完整路径,SLM将在搜索路径中查找可执行文件。

-r recovery_mode

设置SLM监控组件的恢复模式。其中之一:none、stop或replace(默认)。当组件异常终止时,如果该组件没有在其repair元素中覆盖此设置,则执行-r选项指定的操作。

-R frequency

设置SLM尝试恢复异常终止的组件的频率。frequency参数以整数和以下后缀之一的形式指定最大恢复尝试次数,以正斜杠分隔:sec (seconds)、min (minutes)或hour。例如,1 /分钟。默认为2/min(每分钟2次)。

-s comp_name

命名一个在SLM启动时要启动的组件或模块。为了方便起见,您可以使用内置的伪模块all和none(默认为“all”)。

-t polling_interval

为wait属性设置以毫秒为单位的轮询间隔。默认是100。

-T total_wait

设置总等待时间(毫秒)。默认是50000。

-v

指定输出的详细程度(消息写入到slog2info)。-v选项是累积的;每增加一个v就增加一个级别,最多7级。默认级别是警告消息。

-V

将输出消息记录到控制台。-V选项是累积的;每个额外的V都增加了一个层次的冗长。默认级别是错误消息。

-x comp_name

指定一个组件或模块在SLM终止时终止。为了方便起见,您可以使用内置的伪模块all和none(默认为all)。

描述:

1.系统启动和监控(SLM)服务将必须以特定顺序启动的复杂多进程应用程序。

2.一个或多个配置文件控制SLM的行为。配置文件指定要运行的进程、它们的属性和任何进程间依赖关系。SLM使用配置文件中的信息在内部构造一个有向无环图(DAG)。SLM使用DAG来确定启动进程的顺序。

3.类似地,当一个进程失败时,SLM决定终止任何依赖的进程并在SLM再次启动该进程时重新启动。

4.当您启动SLM时,您必须指定一个配置文件,但是所有其他参数都是可选的。

5.客户端应用程序可以使用slmctl实用程序或直接向/dev/slm接口写入命令来控制SLM。

控制和查询命令

客户端应用程序可以通过向/dev/slm接口写入命令来控制SLM。

控制命令可以启动、停止、重启或替换指定的模块或组件。当您启动组件时,SLM将启动任何依赖项(尚未运行的),并根据需要等待它们。当您停止一个组件时,SLM首先停止对该组件的任何依赖。重启是停止和启动操作的顺序组合,通常用于设置特定的高级模块状态。替换将停止并重新启动组件,然后重新启动依赖于该组件的当前活动组件。这通常用于更新低级组件流程。

查询命令可以列出依赖项(依赖项)、运行组件(活动组件)或异常终止组件(死亡组件)。命令行由命令、任何选项和模块或组件名称(如果合适的话)组成。

只有系统超级用户(UID 0)可以执行控制和查询命令(active和depend除外)。

控制和查询命令汇总如下表:

CommandOptionsDescription
active-v列出活动(运行)的组件。
dead-v -w列出失效(有故障)的组件。
depend-s -u -v列出指定组件的一个或多个依赖项。
start-d -v -x启动指定的组件。
stop-s -v -x停止指定的组件。
restart-d -s -v -x停止指定的组件。
replace-d -s -v -x更新指定的组件。

所有选项说明如下表所示:

OptionDescription
-d调试模式:使用调试参数列表启动组件。
-p pid只显示指定ID的进程的信息。仅与active连用。
-s无状态:停止组件时忽略任何无状态依赖。
-u由:列出依赖于指定组件的组件。
-v详细:给出响应命令时执行的每个操作的详细信息。
-w等待:阻塞进程,直到进程异常终止。
-x解释:列出所需的操作,但不执行它们。

命令示例:

在执行写入/dev/slm的命令之后,可以从相同的文件描述符读取结果。下面是一个简单的例子(没有错误处理):

int    slm;
char   text[128];
slm = open("/dev/slm", O_RDWR);
write(slm, "start -v all", 12);
while (read(slm, text, sizeof(text)) > 0)
    printf("%s\n", text);
close(slm);

通过slmctl实用程序发出命令

除了以编程方式编写控制/查询命令之外,您还可以使用slmctl实用程序发送SLM命令(通过命令行或交互式输入)。它使用以下语法:

slmctl [-n subsystem_path] "command [component]"...

其中-n subsystem_path设置客户端应用程序写入控制和查询命令的接入点。应该匹配slm选项-n指定的路径。默认是/dev/slm.

该实用程序在一行中显示每个操作的结果,描述了对指定组件或模块的操作,如下所示:

实用程序的输出含义
START component pid|error组件开始
start component组件已经激活(没有错误)。
WAIT component error等待组件。
wait component组件已经激活(没有错误)。
STOP component error组件停止。
stop component组件已经不活跃。
BEGIN module封装多个组件。
END module error仅通过slog2info报告,而不是slmctl。

SLM配置文件

SLM使用XML配置文件来确定启动进程的适当顺序。配置文件列出了SLM要管理的所有程序、程序之间的任何依赖关系、启动进程的命令以及其他属性。

配置文件结构

配置文件的根XML元素是system。所有的元素名都以SLM:开头,所以根元素(和文件的轮廓)看起来像这样:

<SLM:system>
​
  -- component and module descriptions --
​
</SLM:system>

组件(Components

由SLM管理的流程由组件表示。当在模块中指定进程间依赖关系或成员关系时,必须提供一个组件名(通常基于进程名)以便在配置文件中使用。

所有component元素都是根元素的子元素,并包含描述单个组件属性的其他元素。component元素使用以下语法:

<SLM:component name="qconn">
​
  -- component properties --
​
</SLM:component>

组件元素说明如下表所示: 

标签属性ValuesDescription
abilityability1[,ability2, ... abilityn]过程的procnto能力的列表。这个标记相当于on命令的-A选项,能力规范的语法是相同的。使用许多能力规范来启动流程通常不是一个好主意;使用类型来配置功能更加简单和安全。
argscommand_args提供二进制可执行文件的命令行参数列表
cddir_name启动进程时要切换到的目录;这个目录成为进程的工作目录($CWD)。
commandlaunchbg控制进程创建。
nohup控制如何处理信号(无挂起)。
pathname二进制可执行文件的完整路径(例如/usr/bin/qconn)。当调用posix_spawn()时,在argv[0]中传递完整的路径名,而不是将值截断到文件名中。一些实用程序(如sshd)需要这些信息。
builtin内置SLM命令的名称。选项有:创建一个或多个目录。列出要在args元素中创建的目录。no_op不执行任何操作,但是允许等待文件路径。此机制可用于检测在SLM之外启动的进程是否已经就绪。pathmgr_symlink -创建一个或多个快速内核符号链接。列出要在args元素中创建的符号链接。示例: <SLM:command launch="builtin">no_op/SLM:command <SLM:waitfor wait="pathname">/usr/bin/DiagnoseService/SLM:waitfor
session为了启动一个进程作为会话领导,SLM:command元素的launch属性必须包含值session。SLM:command元素还必须有一个SLM:tty子元素。它的值指定将进程的stdin、stdout和stderr重定向到哪里。有关如何使用SLM启动shell的更多信息,请参见示例。
debugcommand_args在调试模式下运行SLM时提供二进制可执行文件的命令行参数的替代列表。该列表可能包含选项(例如-v以增加冗长)。
dependstate[ session | stateless ]组件在运行之前可能需要其他服务处于活动状态。任何先决条件都必须表示为依赖项。依赖有两种形式:会话(有状态)和无状态。使用会话依赖(默认值),假设是客户端/服务器关系;服务器在其所有客户机上存储状态信息。在这个模型中,如果服务器必须停止或重新启动,那么它的所有客户端都必须停止。使用无状态依赖,服务器不维护任何客户端信息,因此如果服务器重新启动,就不需要重新启动客户端。
component_name先决条件组件的名称。一个组件可以有零个、一个或多个依赖项。必须为每个依赖项定义单独的标记。SLM在所有先决条件都运行之前不会启动组件。
envvarclear[ none | login | all ]指定对环境变量的更改。默认情况下,这些变量是从SLM服务器继承的。clear属性指定要清除或保留哪些当前环境变量:none -保留所有当前环境变量login -仅保留初始登录环境变量all清除当前所有环境变量
environment_variables要与当前环境变量合并或覆盖当前环境变量的环境变量列表。使用VAR=value格式指定每个变量。
partitioncontentpartition_name指定将进程放入的自适应调度器分区。有关详细信息,请参见《自适应分区用户指南》。
prioritypriority_algorithm一个字母数字值,表示优先级级别和分配进程的调度策略(例如10r)。f-SCHED_FIFO (FIFO调度机制)r-SCHED_RR(循环调度)o-SCHED_OTHER(其他调度)有关调度策略的描述,请参见《程序员指南》中的“调度策略”。
repair[ default | none | stop | replace ]指定组件异常终止时要采取的动作:default -告诉SLM执行-r命令行选项指定的操作none-SLM不执行恢复操作stop-SLM停止依赖于失败组件的任何其他组件replace-SLM重启故障组件用法:SLM:repair=none/SLM:repair
runmaskcontentcomponent_runmask一个被解释为位掩码的值,它指定进程可以在哪个处理器上运行。它是一个32位整数,可以使用strtol()识别的任何格式来指定。例如,十进制值5对应位掩码00000101,该位掩码允许线程在cpu 0和2上运行。只指定一次运行掩码。有效的运行掩码总是由子程序继承。有关runmask的更多信息,请参见系统架构指南的多核处理章节,以及QNX中微子程序员指南的多核处理章节。
stderriomode[ w[+] | a[+] ]访问方式:重写(w)、读和重写(w+)、修改(a)、读和修改 (a+)。
filename重定向标准错误(stderr)的文件名。
stdiniomode[ r[+] ]访问方式:只读 (r)或读和写 (r+)。
filename重定向标准输入(stdin)的文件名称。
stdoutiomode[ w | a ]访问方式:重写(w)或修改(a)。
filename重定向标准输出(stdout)的文件名。例子:
stopstop[ none | signal ]signal 信号设置(默认值)导致SLM向底层进程发送一个信号。none设置禁用信令;在这种情况下,SLM不采取任何行动来停止进程。
child[ self | before | after ]对于由SLM启动的任何进程,其子进程都不受SLM的直接控制。可以根据slm控制的父进程何时终止来指定这些子进程的关闭。设置为:self(默认)、before和after。
timeouttimeout_time试图很好地停止一个进程的最大时间,以毫秒为单位。如果进程不能很好地停止,就发送SIGKILL给它。如果没有超时,请指定0(默认值)。
data包含发送进程以停止它的信号号。默认情况下,发送SIGTERM,但您可以将其更改为任何信号。如果多次尝试停止进程失败,将发送SIGKILL。当stop属性设置为none时,不需要这个标记值。
ttyfilename当进程作为会话leader打开时,stderr、stdin和stdout被重定向到的文件的名称。
typetypename作为启动组件的安全类型的名称。名称是反映正在执行的安全策略的标签。一般来说,你应该根据你想要发行的内容来选择名称。有关安全策略的信息,请参见《安全开发人员指南》中的“安全策略和强制访问控制”章节。
useruid:gid要分配给底层流程的用户ID和组ID。两个字符串由冒号分隔(例如,jgarvey:techies)。.
waitforwait[ none | delay | pathname | exits | blocks ]一旦启动了组件,SLM可以在启动任何依赖组件之前等待该组件自己设置好。例如:none(默认值)-导致SLM立即启动其他组件。delay-SLM暂停指定的毫秒数。pathname - slm探测指定路径名的外观。exits—slm等待进程使用指定的退出代码退出。如果退出码与预期的不一致,SLM将重启进程。blocks-SLM等待进程中的指定线程到达recv阻塞状态。示例:<SLM:waitfor wait="delay"> 10000/SLM:waitfor
polltimepoll_time:timeout_time与wait="pathname"或wait="exits"一起使用可以指定覆盖全局值的轮询间隔和总等待时间(均以毫秒为单位)。 例如,polltime="100:20000"会导致每100毫秒轮询一次,并在20秒后超时。
data包含指定等待条件的数据:none -无需准备数据。delay -以毫秒为单位的时间(例如,5000为5秒的延迟)。pathname—路径。exits—期望的退出码(默认为0)。blocks -线程ID。

只有command元素是必需的——所有组件都必须有二进制文件的路径。其余元素是可选的。

分模块:

您可以将组件分组为模块。模块内的流程可以组成一个子系统,也可以用于建立一组系统状态,例如基本操作级别和各种更高级别。模块必须被命名,这样它们才能被内部引用。

每个模块必须在一个元素中描述,如下所示:

<SLM:module name="device_monitors">
​
  -- module description --
​
</SLM:module>

要列出模块内的组件,请使用member。成员元素没有属性;元素值通过在各自的组件元素,定义的内部名称引用成员组件。模块不能包含依赖元素。通过在组件名中使用一个带有通配符的成员元素,可以在一个模块中包含多个组件。

例如,你可以这样写:

<SLM:member>devb-*</SLM:member>

可以在XML配置文件中以任何顺序指定组件和模块,但如果发现任何循环依赖项,SLM将引发错误。

重用SLM模块和组件

您可以定义模块和组件,以便在一个或多个SLM文件中重用。这对于分解SLM模块和组件以便在不同的SLM配置文件中重用非常有用。在重用来自其他SLM文件的模块和组件的SLM配置文件中,需要定义这些可重用部分所在位置的文件名。

这样做的语法如下:

<!DOCTYPE SLM_system [
​
  <!ENTITY inclusion_name SYSTEM 'filename'>
​
]>

其中inclusion_name是您在SLM配置文件中用于标识可重用实体的名称,而filename是您系统上定义可重用SLM模块和组件的单独文件。在你的SLM配置文件中,当你想要包含这些可重用的实体时,通过指定以下内容来包含它们:

&inclusion_name;

例如,在您的系统中有一个名为my_reusable_modules.xml的文件,您在其中定义了可以包含在不同SLM配置文件中的SLM模块和组件。

然后,在你的SLM配置文件中,你可以定义一个名为reusemomodules的实体,然后再将其包含进来:

<!DOCTYPE SLM_system [
  <!ENTITY reuseModules SYSTEM 'my_reusable_modules.xml'>
]>
...
<SLM:system>
  ...
  <!-- Include the contents of what's specified in 'my_reusable_modules.xml'by specifying the entity 'reuseModules' -->
  &reuseModules;
  ...
</SLM:system>

样例配置文件

假设您希望自动设置系统的IP连接。这需要运行io-pkt,它为网络通信创建一个IP套接字,然后运行ifconfig将IP地址绑定到这个套接字。您可以创建一个模块来包含两个与这两个服务对应的组件,然后在组件条目中描述ifconfig对io-pkt的依赖关系。XML文件看起来就像这样:

<SLM:system>
	<SLM:component name="io-pkt"> 
		<SLM:command>/sbin/io-pkt-v6-hc</SLM:command>   
		<SLM:args>-ptcpip stacksize=8192</SLM:args>  
		<SLM:waitfor wait="pathname">/dev/socket</SLM:waitfor> 
	</SLM:component> 
      
	<SLM:component name="ifconfig"> 
   	 	<SLM:depend>io-pkt</SLM:depend>  
		<SLM:command>/sbin/ifconfig</SLM:command> 
		<SLM:args>en0 192.168.1.5 up</SLM:args>  
		<SLM:waitfor wait="exits"></SLM:waitfor>
	</SLM:component>
	
	<SLM:module name="net-setup"> 
		<SLM:member>io-pkt</SLM:member>
    	<SLM:member>ifconfig</SLM:member> 
	</SLM:module>
  
  </SLM:system>

下面的例子展示了如何使用SLM启动shell:

<SLM:component name="console"> 
  <SLM:command launch="session">/bin/ksh</SLM:command> 
  <SLM:args>-l</SLM:args> 
  <SLM:tty>/dev/ser1</SLM:tty> 
  ... 
</SLM:component> 

下面的例子展示了如何通过SLM启动sshd(以便监控sshd):

<SLM:component name="sshd">
  <SLM:command launch="pathname">/system/xbin/sshd</SLM:command> 
  <SLM:args>-D</SLM:args>
  ... 
</SLM:component> 

正常终止vs.异常终止

SLM只会在下列情况下认为程序已正常终止:

SLM终止组件的进程是因为:

1.通过执行SLMCTL停止组件创建了一个停止操作。

2.一个依赖项需要SLM来停止组件的进程。

组件配置为waitfor=exits,组件的进程退出时带有预期的退出代码。

所有其他进程终止都被认为是异常的,并导致SLM重新启动组件进程。如果某个进程在某一时间段内死得太频繁,那么即使终止异常,SLM也会停止尝试重新启动该进程。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值