原文:http://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除外)。

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

Command Options Description
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 更新指定的组件。

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

Option Description
-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>

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

标签 属性 Values Description
ability ability1[,ability2, ... abilityn] 过程的procnto能力的列表。这个标记相当于on命令的-A选项,能力规范的语法是相同的。使用许多能力规范来启动流程通常不是一个好主意;使用类型来配置功能更加简单和安全。
args command_args 提供二进制可执行文件的命令行参数列表
cd dir_name 启动进程时要切换到的目录;这个目录成为进程的工作目录($CWD)。
command launch bg 控制进程创建。
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的更多信息,请参见示例。
debug command_args 在调试模式下运行SLM时提供二进制可执行文件的命令行参数的替代列表。该列表可能包含选项(例如-v以增加冗长)。
depend state [ session | stateless ] 组件在运行之前可能需要其他服务处于活动状态。任何先决条件都必须表示为依赖项。依赖有两种形式:会话(有状态)和无状态。使用会话依赖(默认值),假设是客户端/服务器关系;服务器在其所有客户机上存储状态信息。在这个模型中,如果服务器必须停止或重新启动,那么它的所有客户端都必须停止。使用无状态依赖,服务器不维护任何客户端信息,因此如果服务器重新启动,就不需要重新启动客户端。
component_name 先决条件组件的名称。一个组件可以有零个、一个或多个依赖项。必须为每个依赖项定义单独的标记。SLM在所有先决条件都运行之前不会启动组件。
envvar clear [ none | login | all ] 指定对环境变量的更改。默认情况下,这些变量是从SLM服务器继承的。clear属性指定要清除或保留哪些当前环境变量:none -保留所有当前环境变量login -仅保留初始登录环境变量all清除当前所有环境变量
environment_variables 要与当前环境变量合并或覆盖当前环境变量的环境变量列表。使用VAR=value格式指定每个变量。
partition content partition_name 指定将进程放入的自适应调度器分区。有关详细信息,请参见《自适应分区用户指南》。
priority priority_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
runmask content component_runmask 一个被解释为位掩码的值,它指定进程可以在哪个处理器上运行。它是一个32位整数,可以使用strtol()识别的任何格式来指定。例如,十进制值5对应位掩码00000101,该位掩码允许线程在cpu 0和2上运行。只指定一次运行掩码。有效的运行掩码总是由子程序继承。有关runmask的更多信息,请参见系统架构指南的多核处理章节,以及QNX中微子程序员指南的多核处理章节。
stderr iomode [ w[+] | a[+] ] 访问方式:重写(w)、读和重写(w+)、修改(a)、读和修改 (a+)。
filename 重定向标准错误(stderr)的文件名。
stdin iomode [ r[+] ] 访问方式:只读 (r)或读和写 (r+)。
filename 重定向标准输入(stdin)的文件名称。
stdout iomode [ w | a ] 访问方式:重写(w)或修改(a)。
filename 重定向标准输出(stdout)的文件名。例子:
stop stop [ none | signal ] signal 信号设置(默认值)导致SLM向底层进程发送一个信号。none设置禁用信令;在这种情况下,SLM不采取任何行动来停止进程。
child [ self | before | after ] 对于由SLM启动的任何进程,其子进程都不受SLM的直接控制。可以根据slm控制的父进程何时终止来指定这些子进程的关闭。设置为:self(默认)、before和after。
timeout timeout_time 试图很好地停止一个进程的最大时间,以毫秒为单位。如果进程不能很好地停止,就发送SIGKILL给它。如果没有超时,请指定0(默认值)。
data 包含发送进程以停止它的信号号。默认情况下,发送SIGTERM,但您可以将其更改为任何信号。如果多次尝试停止进程失败,将发送SIGKILL。当stop属性设置为none时,不需要这个标记值。
tty filename 当进程作为会话leader打开时,stderr、stdin和stdout被重定向到的文件的名称。
type typename 作为启动组件的安全类型的名称。名称是反映正在执行的安全策略的标签。一般来说,你应该根据你想要发行的内容来选择名称。有关安全策略的信息,请参见《安全开发人员指南》中的“安全策略和强制访问控制”章节。
user uid:gid 要分配给底层流程的用户ID和组ID。两个字符串由冒号分隔(例如,jgarvey:techies)。.
waitfor wait [ 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
polltime poll_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也会停止尝试重新启动该进程。

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

  1. Mini-XML 程序员开发手册, Version 2.5(转)

    Mini-XML 程序员开发手册, Version 2.5 目录 中文翻译:Z.F , mail: zhfjyq@gmail.com ,http://blog.csdn.net/bluesonic 序 ...

  2. 5. 阿里巴巴程序员开发手册黄山版

    学习的动力不止于此: 最近阅读了刘典武大神推荐的阿里巴巴Java开发手册泰山版.里面的很多规范不仅仅适用于Java.非常值得我们一起学习. 于是,我找了最新的版本–黄山版. 正所谓,五岳归来不看山,黄 ...

  3. SGX程序员开发手册

    文章目录 前言 Introduction Enclave Programming Model Enclave File Format Enclave Trusted Computing Base En ...

  4. 那些年,程序员开发过的好玩的程序

    作者:小渡|来源:Duing 前言 都说,程序员们有一个共同的梦想:用代码改变世界.2020年是特殊的一年,我们经历了疫情.洪水.台风--,在这个过程中,程序员也运用代码技术发挥了重要的力量. 代码技 ...

  5. 程序员开发软件的意义在哪?

    有一篇热文<写了8年的代码,做过的项目都下线了,程序员的意义在哪里!>,作者8年工作和业余时间开发几十个项目,几乎都关闭了. 想当初,很用心的去开发每一个项目:如今,这些项目只能一个个关闭 ...

  6. 2017年秋招美团Java程序员开发,看我如何拿到offer

    转载自  2017年秋招美团Java程序员开发,看我如何拿到offer 本人是一名本科毕业非计算机专业的程序员,面了阿里,结果没过,最后面上了美团,热乎乎的面经,昨天面的美团,虽然面完了HR面,但是感 ...

  7. PHP程序员开发win32应用程序之梦

    相信做纯WEB开发的PHP程序员都会想过,要是PHP能开发windows本地应用程序多好,于是上网一查找出来的很多都是"PHP-GTK"的老文章,这东西好像已经没人维护了,随便看了 ...

  8. 2017年美团Java程序员开发,看我如何拿到offer

    2017年美团Java程序员开发,看我如何拿到offer 热乎的面经,昨天面的美团,虽然面完了HR面,但是感觉希望不大,希望能走运拿到offer吧.三面技术面面经如下: 一面: 中间省略掉大概几个问题 ...

  9. 活久见!程序员开发进度太慢被公司告上法庭,索赔 90 万!

    loonggg 读完需要 5 分钟 速读仅需 2 分钟 大家好,我是校长. 真的是开眼了,活久见啊,公司因为嫌弃程序员开发进度太慢,耽误上线,竟然将程序员告上了法庭,要求程序员赔偿公司经济损失 90 ...

最新文章

  1. 生态伙伴 | Canva上线飞书应用目录,帮你零门槛轻松做出大师级设计!
  2. 推荐!最适合初学者的18个经典开源计算机视觉项目
  3. oracle asm dd命令,使用dd命令复制ASM磁盘的spfile
  4. js和java中URI的编码和解码
  5. C++ 类的行为 | 行为像值的类、行为像指针的类、swap函数处理自赋值
  6. 鸿蒙明年可以在手机上用吗,华为王成录:鸿蒙已满足在手机上使用,明年一二月份向部分用户开放...
  7. win10系统电脑wifi图标不见了的开启方法
  8. centos php ssl,CentOS下在Nginx中添加SSL证书以支持HTTPS协议访问
  9. php rewrite重写,yaf 自定义重写路由rewrite
  10. GIS案例练习-----------第五天
  11. 云课堂智慧职教网页版登录入口_云课堂智慧职教网页版
  12. ROI Pooling原理
  13. 求齐次线性方程组的基础解系matlab,MATLAB学习笔记:齐次线性方程组的基础解系...
  14. SSH-简单登陆业务详解,从环境部署到代码编写
  15. 是配置在计算机硬件上的最基本的系统软件,试题库
  16. 中国能源建设合并葛洲坝又有最新进展,葛洲坝即将终止上市
  17. 绍耕反失败学课程(06)——在正确时间做正确的事情,轻装上阵抛弃负担
  18. 送书 |《Python数据分析从小白到专家》
  19. CSS学习笔记--文本格式化
  20. 2020老年产业过去|现在|未来:疫情促进“线上化”,各分支加速融合创新

热门文章

  1. 局域网内两台主机 IP ping 不通的问题分析
  2. office 高效办公智慧树_智慧树知到《OFFICE高效办公》见面课答案
  3. 开发规范及具体开发任务分工
  4. IP地址的分类 十进制与二进制的转换
  5. matlab雷达目标回波仿真
  6. 第五章 如何使用java中的线程打印偶数和奇数
  7. 在cmd命令窗口安装Python模块
  8. 恶性淋巴瘤及其实验诊断题库【1】
  9. MySQL调优是程序员拿高薪的必备技能?
  10. 我的极限Scrum实践