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>
|
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>
|
实验
包含两个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>
|
将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
异常情况
- 如果b.xml中有多个module要启动,如果其中一个module因为“ No such file or directory” 错误而无法执行,那么slm将会停止启动排在它后面的模块;