背景
了解学习QNX -SLM机制
内容
参考 QNX7.0 SLM,若需了解更过内容可移步
SLM是什么
系统启动和监控:启动由许多必须按特定顺序启动的进程组成的复杂应用程序,下图是可以看到SLM在整个QNX BOOT的运行位置。
怎么用
可以通过slmctrl控制。但是我们通常使用xml配置的方式来确定进程的启动顺序。
SLM 配置概要
//根节点
<SLM:system>
//组件,可以有多个组件
<SLM:component name="io-pkt">
//指令--执行/sbin/io-pkt-v6-hc
<SLM:command>/sbin/io-pkt-v6-hc</SLM:command>
//执行指令需要的参数--ptcpip stacksize=8192
<SLM:args>-ptcpip stacksize=8192</ SLM:args>
//启动后等待--等待/dev/socket起来
<SLM:waitfor wait="pathname">/dev/socket</SLM:waitfor>
</SLM:component>
<SLM:component name="ifconfig">
//依赖项--需要依赖io-pkt起来后才能启动
<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">
//执行io-pkt
<SLM:member>io-pkt</SLM:member>
//执行ifconfig
<SLM:member>ifconfig</SLM:member>
</SLM:module>
</SLM:system>
SLM 组件属性
<SLM:ability>:procnto赋予能力。
<SLM:ability> ability </SLM:ability>
procnto(结合了内核和进程管理器)赋予能力的过程,如root,deny,fork(参考on)。
<SLM:args>:启动进程的命令行参数列表。
<SLM:args>args</SLM:args>
<SLM:cd>:启动进程时切换到的目录。
<SLM:cd>directory </SLM:cd>
<SLM:command>:启动执行指令
<SLM:command [launch=" launch_option [ launch_option ]..."]>
executable_path </SLM:command>
- executable_path–要执行的二进制文件或脚本文件路径。
<SLM:debug>:在调试模式下启动进程时要使用的命令行参数。
<SLM:debug> command_args </SLM:debug>
<SLM:depend>:启动组件所需要的依赖
<SLM:depend [state="session|stateless"]>
component_name </SLM:depend>
在所有依赖都在运行并且所有等待完成之前,SLM 不会启动组件。
- session–停止组件时,SLM 首先停止依赖它的组件。
- stateless–停止组件时,依赖组件不受影响。
<SLM:envar>:指定对环境变量的更改。
<SLM:envar [clear="none|login|all"]>
environment_variables </SLM:envar>
默认情况下,这些变量是从 SLM 继承的。
- none–保留所有环境变量(default)
- login-- 清除所有环境变量,除了 环境元素指定 BAUD、DISPLAY、 HZ、PHOTON、 SYSNAME、TERM、TZ、 HOME、LOGNAME、 PATH、SHELL、TERM和 USERNAME。
- all–清除所有当前环境变量。
<SLM:groups>:指定组件进程的组访问列表的组 ID 列表
<SLM:groups> gid_1 [, gid_2 ]... </SLM:groups>
<SLM:partition>:指定将进程放入的自适应调度程序分区。
<SLM:partition> partition_name </SLM:partition>
<SLM:priority>:指示分配进程的优先级和调度策略
<SLM:priority> priority_algorithm </SLM:priority>
- f— SCHED_FIFO(先进先出调度)
- r— SCHED_RR(循环调度)
- ○— SCHED_OTHER(其他调度)
调度策略的描述请参见程序员指南中的 “调度策略”。
<SLM:repair>:指定组件异常终止时要采取的操作
<SLM:repair> default|none|stop|restart </SLM:repair>
- default-- SLM 执行由-r命令行选项指定的操作。
- none–SLM 不采取恢复行动。
- stop–SLM 停止依赖于发生故障的组件的任何其他组件
- restart–SLM 重新启动出现故障的组件
<SLM:runmask>:指定进程可以在哪些处理器上运行
<SLM:runmask> component_runmask </SLM:runmask>
解释为位掩码的值,它指定进程可以在哪些处理器上运行。它是一个 32 位整数,可以使用strtol()识别的任何格式指定 。
例如,十进制值 5对应于位掩码 00000101,它允许线程在 CPU 0 和 2 上运行。
<SLM:stderr>:错误文件地址
<SLM:stderr [iomode="w[+]|a[+]"]> stderr_filename </SLM:stderr>
overwrite (w), read and overwrite (w+; default), append (a), or read and append (a+).
<SLM:stdin>:输入文件地址
<SLM:stdin [iomode="r[+]"]> stdin_filename </SLM:stdin>
read only ® or read and write (r+).
<SLM:stdout>:输出文件地址
<SLM:stdout [iomode="w|a"]> stdout_filename </SLM:stdout>
overwrite (w) or append (a).
<SLM:stop>:停止组件
<SLM:stop
[stop="none|signal"] [child="false|true"] [timeout=" timeout_time "]>
stop_data </SLM:stop>
停止进程索要发生的信号编码或者名字。
- stop:signal(default)发送信号编码或名字给下层进程,none表示什么都不做。
- child:true停止进程前先停掉子进程,false(default)不会先停子进程。
- timeout:停止操作的超时时间,超时发送SIGKILL
<SLM:tty>:错误,输入,输出文件地址
<SLM:tty> tty_filename </SLM:tty>
<SLM:type>:要启动组件的安全类型的名称
<SLM:type> type_name </SLM:type>
该名称是反映正在实施的安全策略的标签。通常,您应该根据您尝试启动的内容来选择一个名称。有关安全策略的信息,请参阅安全开发人员指南中的“安全策略”一章。
<SLM:user>:为底层进程分配用户 ID (UID)、组 ID (GID) 或两者。
<SLM:user> uid |: gid | uid : gid </SLM:user>
这些值可以是要在/etc/passwd和 /etc/group 中查找的名称。
<SLM:waitfor>:组件起来后执行一些操作
<SLM:waitfor [wait="none|delay|pathname|exists|blocks"]
[ polltime=poll_time:timeout_time]> waitfor_data </SLM:waitfor>
- none–立即启动相关组件
- delay–启动相关组件前延迟一会
- pathname–检查相关组件是否启动
- exists–等待相关组件以指定的代码退出,若预期不同将重启该组件
- blocks–等待进程中的指定线程到达 RECV 阻塞 状态。
- polltime–例如, polltime=“100:20000” 结果每 100 毫秒轮询一次,并在 20 秒后超时。
waitfor_data:对应到上面说的参数,可以是时间、路径、预期的退出代码、线程id
SLM 组件复用(系统中常用方式)
可以定义模块和组件以在一个或多个 SLM 文件中重复使用。这对于分解 SLM 模块和组件以在不同的 SLM 配置文件中重用非常有用。
<!DOCTYPE SLM_system [
<!ENTITY resumeModules SYSTEM 'my_reusable_modules.xml'>
]>
...
<SLM:system>
...
<!--通过指定实体'包含'my_reusable_modules.xml'中指定的内容重用模块'-->
&reuseModules;
...
</SLM:system>
SLM 进程终止
SLM 仅在以下情况下认为进程已正常终止:
- 通过执行创建停止操作 slmctl 停止 组件。
- 依赖项需要 SLM 来停止组件的进程。
- 该组件配置了一个 等待=退出 并且组件的进程以预期的退出代码退出。
所有其他进程终止都被视为异常并导致 SLM 重新启动组件的进程。如果某个进程在某个时间段内死得太频繁,即使终止异常,SLM 也会停止尝试重新启动该进程。
SLM7.0 & 7.1 对比
暂未识别出差异