QNX SLM
SLM是Qnx中用來加載Application的組件,它可以監控Application行為(比如異常退出時重新Application拉起)、控制Application間的啟動時序。
QNX的SLM與Android RC文件類似。
下面摘自QNX官網介紹
System launch and monitor: launch complex applications consisting of many processes that must be started in a specific order
QNX SLM官網鏈接:
https://www.qnx.com/developers/docs/7.1/#com.qnx.doc.neutrino.utilities/topic/s/slm.html
使用SLM,主要包括兩部分。
- SLM命令,命令支持語法如下
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
- SLM配置文件(*.slm),如QNX官網給出的例子
<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命令
關于SLM支持的全部命令的解釋,可以參考QNX官網。
這里對其常用的幾個命令項說明一下。
-p priority:設置線程優先級,就是被SLM拉起的Application的線程優先級。默認是30,數字越大優先級越高。
-R frequency: 被SLM拉起的Application異常退出后,SLM嘗試重新拉起(Recover)的Application的頻率。單位是秒、分,或者小時。比如2/min(一分鐘兩次)
-v SLM啟動Application輸出log的級別。
例子:
通過slm啟動Application,Application配置文件是slm-config-linduo.xml
配置項:線程優先級(10)、異常退出后每分鐘嘗試啟動(20次)、默認輸出WarningMessage。
slm -v -p 10 -R 20/min /etc/slm/config/slm-config-linduo.xml
SLM配置文件
SLM的配置文件,是xml的格式。比如上面例子中的slm-config-linduo.xml。
官網給出了關于配置文件的詳細說明。
https://www.qnx.com/developers/docs/7.1/#com.qnx.doc.neutrino.utilities/topic/s/slm.html
以下面的例子解釋一下使用的字段:該端配置文件的主要功能是:
- 以/mnt/apps/linduo作為WorkDir
- 通過SLM啟動my_linduo這個程序
- -線程優先級有20,調度方式為(SCHED_RR)
- 程序的Type類型(跟QNX安全有關)為default_root_t(就是root權限)
- my_linduo程序異常退出時進行重啟操作(restart)-
- Runmask表示可以跑在CPU哪個核上,7表示CPUs 0、1、2 (0111)。
<SLM:system><!-- my_linduo--><SLM:component name="my_linduo"><SLM:cd>/mnt/apps/linduo/</SLM:cd><SLM:command>/mnt/apps/linduo/my_linduo</SLM:command><SLM:priority>20r</SLM:priority><SLM:type>default_root_t</SLM:type><SLM:repair>restart</SLM:repair><SLM:runmask>7</SLM:runmask></SLM:component></SLM:system>
這里要特殊說明的一個寫法是SLM:depend和SLM:waitfor,關于這倆標簽的用法,很容易產生誤解。
先看下面的例子
<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="delay">5000</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:component>
</SLM:system>
ifconfig依賴 io-pkt。所以會先啟動 io-pkt。這個時候io-pkt對應的/sbin/io-pkt-v6-hc就執行了。
然后,等待5秒后,才會啟動ifconfig。
所以,waitfor不是先等待,然后才執行。而是先把io-pkt啟動后,再等待5秒。
關于SLM配置文件的具體寫法,可以參考QNX官網。