SLM (System launch and monitor) 系统启动和监控上手指南

SLM (System launch and monitor)

QNX为一些复杂的进程提供便利的启动手段,尤其适合多个进程之间存在依赖,且它们之间有严格的启动时序要求的场景;

QNX Doc 7.0 : SLM

命令格式

1
2
3
4
5
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

参数

  • -v 设定slog2输出等级,并输出到slog2系统,默认是warning等级;它是累加的,-vv = verbosity Level 2,-vvvvvvv = verbosity Level 7;
  • -V 设定log输出等级,并输出到控制台,默认是error等级;它是累加的,-VV = verbosity Level 2,-VVVVVVVV = verbosity Level 7;

SLM configuration file

使用xml来配置启动的进程

xml的根元素

1
2
3
<SLM:system>
-- component and module descriptions --
</SLM:system>

Components

所有的进程都将存放在components中

1
2
3
<SLM:component name="qconn">
-- component properties --
</SLM:component>

参数

有将近20来个参数,捡几个常用的讲讲;

  • args :运行进程是后面的参数,多个参数只需要用空格分开即可
  • cd : 在执行command前,执行切换路径命令cd
  • command : 需要SLM执行的命令,或者进程
  • depend : 启动command的依赖,为component name,多个依赖需要增加这个字段
  • waitfor : 进程启动后,只有waitfor的项目满足了,才会去启动依赖该项目的命令或进程

modules

由多个component组成

1
2
3
<SLM:module name="device_monitors">
-- module description --
</SLM:module>
  • 样例XML文件

net-setup模块,包含了io-pkt和ifconfig两个Component;

  • 首先,启动io-pkt这个组件
  • 第二,通过ifconfig设置ip
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<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>

实验

  • a.xml

包含两个component

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<SLM:component name="icservice">
<SLM:command>/cluster/bin/CMW_Cluster</SLM:command>
<SLM:args>none</SLM:args>
<SLM:depend>inc_server</SLM:depend>
<SLM:repair>none</SLM:repair>
</SLM:component>

<SLM:component name="icbkhmi">
<SLM:cd>/cluster/icbkhmi/</SLM:cd>
<SLM:command>/cluster/icbkhmi/ClusterBackground</SLM:command>
<SLM:args>none</SLM:args>
<SLM:depend>icservice</SLM:depend>
<SLM:repair>none</SLM:repair>
</SLM:component>
  • b.xml

将a.xml包含到b.xml,这种方式好处是模块化,每个人都可以构建自己模块的一个xml,然后再包含到b.xml中;

1
2
3
4
5
6
<!DOCTYPE SLM_system [
<!ENTITY cluster_hmi SYSTEM 'a.xml'>
]>
<SLM:system>
&cluster_hmi;
</SLM:system>
  • SLM启动a.xml中定义的两个component
1
slm -V b.xml

异常情况

  • 如果b.xml中有多个module要启动,如果其中一个module因为“ No such file or directory” 错误而无法执行,那么slm将会停止启动排在它后面的模块;