qnx slm7.1(程序员开发手册-翻译)

原文:

http://www.qnx.com/developers/docs/7.1/index.html#com.qnx.doc.neutrino.utilities/topic/s/slm.htmlicon-default.png?t=M0H8http://www.qnx.com/developers/docs/7.1/index.html#com.qnx.doc.neutrino.utilities/topic/s/slm.html

系统启动和监视器:启动由许多必须按特定顺序启动的进程组成的复杂应用程序

语法:

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将在启动时采用这些进程,就像它自己启动了这些进程一样(因此可以通过命令界面控制这些进程,或者在进程异常终止时自动重新启动它们;参考( 正常终止与异常中止),采用机制只有在组件配置文件对应于运行过程中使用完全相同的参数(使用args元素指定)的运行Process和参数的顺序相同。否则,SLM将无法识别该组件对应于正在运行的流程。

  • -D  debug_mode (调试模式)

    指定何时使用SLM:debug参数列表(而不是普通的SLM:args列表)。其中之一:cmd(默认)、startup或always。在cmd中,调试列表仅在使用带有[-d]的slmctl启动模块时使用。在启动时,所有在启动时启动的组件(请参阅-s选项)最初使用调试列表,但随后重新启动时使用-d选项。对于always,调试列表总是被使用。

  • -n subsystem_path(接入点路径)

    为客户端应用程序设置接入点(默认是/dev/slm)来写控制和查询命令。有关控制和查询命令的更多信息,请参见slmctl

  • -p priority (优先级)

    —设置SLM服务器线程的优先级(默认为30)。

  • -P search_path(搜索路径)
    slm -n /proc/boot/slm -s none -P /etc/safety_config safety.xml
    slmctl -n /proc/boot/slm "start -v diagnose-service.service"

    设置可执行文件的搜索路径(默认为$ PATH)。当启动一个流程时,如果相应的命令元素不包含完整的路径,SLM将在搜索路径中查找可执行文件。

  • -r recovery_mode(恢复模式)

    设置SLM监控的组件的恢复模式。其中一种:none、stop或restart(默认值)。当组件异常终止时,如果该组件没有在其repair元素中覆盖此设置,则使用-r选项指定的操作将被执行。

  • -R frequency(频率)

    设置SLM尝试恢复异常终止的组件的频率。frequency参数将最大恢复尝试次数指定为整数和以下后缀之一,以正斜杠分隔:sec(秒)、min(分钟)或hour。例如,1/min。默认为2/min(每分钟2次)。

  • -s comp_name(编号)

    命名slm启动时要启动的组件或模块。为了方便起见,你可以使用内置的伪模块all和none(默认是all)。

  • -t polling_interval(轮询间隔)

    为wait属性设置轮询间隔(以毫秒为单位)。默认是100。

  • -T total_wait

    设置总等待时间,以毫秒为单位。默认为50000(50秒)。

  • -v

    指定输出详细程度(消息被写入slog2info)。-v选项是累加的;每增加一个v就会增加一个级别的冗长,最多可达7个级别。默认级别为警告消息。

  • -V

    将输出消息记录到控制台。-V选项是累加的;每个额外的V都增加了一种冗长程度。默认级别为错误消息。

  • -x comp_name

    当slm终止时,命名要终止的组件或模块。为了方便起见,你可以使用内置的伪模块all和none(默认是all)。

描述:

系统启动和监控(SLM)服务自动化了必须按照特定顺序启动的复杂的多进程应用程序的管理。配置文件控制SLM的行为。它指定要运行的进程、它们的属性以及任何进程间依赖关系。如果需要,可以使用XML外部实体包含其他XML文件。SLM使用配置文件中的信息在内部构造一个有向无环图(DAG)。SLM使用DAG来确定启动流程的顺序。类似地,当一个进程失败时,当SLM再次启动该进程时,SLM决定终止并重新启动任何依赖的进程。在启动SLM时,必须确保slogger2正在运行并指定一个配置文件,但是所有其他参数都是可选的。客户端应用程序可以使用slmctl实用程序或直接向/dev/slm接口写入命令来控制SLM。有关控制和查询命令的更多信息,请参见slmctl

SLM配置文件

SLM使用XML配置文件来确定启动流程的适当顺序。配置文件列出了SLM要管理的所有程序、程序之间的任何依赖关系、启动进程的命令以及其他属性。

配置文件结构

配置文件的根XML元素是system。所有的元素名都以SLM:开头,所以根元素(和文件的大纲)看起来像这样:

<SLM:system>
    ——组件和模块描述--
</SLM:system>

组件

由SLM管理的进程由组件表示。当在模块中指定进程间依赖关系或成员关系时,必须提供一个组件名称(通常基于进程名称),以便在配置文件中使用。

所有组件元素都是根元素的子元素,并包含描述单个组件属性的其他元素。组件元素使用以下语法:

<SLM:component name="component_name">
    <SLM:ability> ability </SLM:ability>
    <SLM:args> args </SLM:args>
    <SLM:cd> directory </SLM:cd>
    <SLM:command [launch=" launch_option[,launch_option]... "]>
                 executable_path</SLM:command>
    <SLM:debug> command_args </SLM:debug>
    <SLM:depend [state="session|stateless"]>
                component_name </SLM:depend>
    <SLM:envar [clear="none|login|all"]>
               environment_variables </SLM:envar>
    <SLM:groups> gid_1[,gid_2]... </SLM:groups>
    <SLM:partition> partition_name </SLM:partition>
    <SLM:priority> priority_algorithm </SLM:priority>
    <SLM:repair>  default|none|stop|restart  </SLM:repair>
​
    <SLM:runmask> component_runmask  </SLM:runmask>
    <SLM:stderr [iomode="w[+]|a[+]"]> filename </SLM:stderr>
    <SLM:stdin [iomode="r[+]"]> filename </SLM:stdin>
    <SLM:stdout [iomode="w|a"]> filename </SLM:stdout>
    <SLM:stop 
        [stop="none|signal"] [child="false|true"] [timeout="timeout_time"]>
        data </SLM:stop>
    <SLM:tty> filename </SLM:tty>
    <SLM:type> type_name </SLM:type>
    <SLM:user> uid|:gid|uid:gid </SLM:user>
    <SLM:waitfor [wait="none|delay|pathname|exists|blocks"]
                 [polltime="poll_time:timeout_time"]> data </SLM:waitfor>
</SLM:component>

只有command 元素是必需的——所有组件都必须有二进制文件的路径。其余的元素是可选的。

SLM:ability

<SLM:ability> ability </SLM:ability>
  • ability

    一种给予procnto能力的过程。这个元素相当于on命令的-A选项,并且能力规范的语法是相同的。为每个需要的能力指定一个能力元素。使用许多能力规范来启动过程通常不是一个好主意;使用类型配置功能更简单、更安全。

SLM:args

<SLM:args> args </SLM:args>
  • args

    启动进程的命令行参数列表。使用空格分隔单个参数。如果参数包含内嵌空格,则用单引号或双引号将其括起来。如果为内置命令指定参数,则用空格分隔参数,用分号(;)分隔参数集。有关更多信息,请参阅SLM:command>描述。如果组件对应于SLM将采用的运行进程,就像SLM启动了它一样(由-a选项指定),请确保参数与运行进程使用的参数相同。

SLM:cd

<SLM:cd> directory </SLM:cd>
  • directory

    启动进程时要切换到的目录;这个目录成为进程的工作目录。

SLM:command

<SLM:command [launch=" launch_option[ launch_option]... "]>
             executable_path</SLM:command>
  • launch=" launch_option[ launch_option]..."

    launch_option 可以指定以下选项中的一个或多个,用空格分隔:

    builtin 内置SLM命令的名称。chmod path mode—调用chmod(),并传递指定的路径和mode值。

    no_op 什么都不做。可以用于等待文件路径或检测在SLM之外启动的进程是否准备就绪。

    调用link()并将指定的参数传递给它。

    mkdir path mode -调用mkdir()并传递指定的路径和模式值。

    pathmgr_symlink path symlink -调用pathmgr_symlink()并传递指定的参数给它。

    pathmgr_unlink path -调用pathmgr_unlink()并传递指定的参数给它。

    remove filename -调用remove()并将指定的参数传递给它。

    调用symlink()并将指定的参数传递给它。

    system命令-调用system()并将指定的参数传递给它。

    unlink path -调用unlink()并将指定的参数传递给它。

    你在<SLM中为函数指定 SLM:args。参数用空格隔开,参数集用分号(;)隔开。例如,下面的条目创建了两个参数用于pathmgr_symlink:

    <SLM:args>path1 symlink1; path2 symlink2</SLM:args>

    下面提供的配置文件示例包含了一个使用内置选项的组件。路径名-当调用posix_spawn()时,在argv[0]中传递完整的路径名,而不是截断值到文件名。一些实用程序(如sshd)需要此信息。要启动一个进程作为一个会话leader, SLM的启动<SLM:command>元素必须包含value session和SLM:component元素必须有一个SLM:tty子元素<SLM: tty>元素的值指定在哪里重定向进程的stdinstdoutstderr。有关如何使用SLM启动shell的更多信息,请参见示例。

  • executable_path

    指定要执行的二进制文件或脚本的路径(绝对或相对)。

SLM:debug

<SLM:debug> command_args </SLM:debug>
  • command_args

    SLM以调试模式启动进程时使用的另一个命令行参数列表。例如,在列表中包含-vvvvvv将在调试模式下运行时启动相关的进程,并增加其冗余。

SLM:depend

<SLM:depend [state="session|stateless"]>
                component_name </SLM:depend>
  • state="session|stateless"

    session—如果一个组件必须停止或重新启动,SLM首先停止依赖它的组件(由component_name指定)。通常,当组件之间存在客户机-服务器关系时,您可以指定会话,而服务器维护客户机信息。无状态——如果一个组件必须停止或重新启动,那么依赖它的组件不受影响。例如,如果组件之间存在客户端-服务器关系,但服务器不维护任何客户端信息,那么在服务器重新启动后,就不需要重新启动客户端。

  • component_name

    先决条件组件的名称。一个组件可以有零个或多个依赖项。您必须为每个依赖项定义一个单独的元素。SLM在所有先决条件都运行并完成所有等待之前不会启动组件。

SLM:envar

<SLM:envar [clear="none|login|all"]>
               environment_variables </SLM:envar>
  • clear="none|login|all"

    指定对环境变量的更改。默认情况下,这些变量继承自SLM。

    clear属性指定要清除或保留哪些当前环境变量;

    none -保留所有当前环境变量(默认值);

    login -清除所有环境变量,除了envar元素指定的变量,以及BAUDDISPLAYHZPHOTONSYSNAMETERMTZHOMELOGNAMEPATHSHELLTERMUSERNAME

    all -清除当前所有环境变量。

  • environment_variables

    要与当前环境变量合并或覆盖的环境变量列表。使用格式VAR=value来指定每个变量。

SLM:groups

<SLM:groups> gid_1[,gid_2]... </SLM:groups>
  • gid_1[,gid_2]...

    组id列表,用于指定组件进程的组访问列表。

SLM:partition

<SLM:partition> partition_name </SLM:partition>

SLM:priority

<SLM:priority> priority_algorithm </SLM:priority>
  • priority_algorithm

    一个字母数字值,指示优先级和分配进程的调度策略(例如,10r)。f-SCHED_FIFO (FIFO scheduling) r-SCHED_RR (Round-robin scheduling) o-SCHED_OTHER (other scheduling)调度策略的描述请参见《程序员指南》中的“scheduling policies”。

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>
  • component_runmask

    一个被解释为位掩码的值,它指定进程可以在哪个处理器上运行。它是一个32位整数,可以使用* strool()*能识别的任何格式指定。例如,十进制值' 5 '对应于位掩码00000101,它允许线程运行在cpu 0和cpu 2上。只指定一次runmask。一个有效的runmask总是由子进程继承。有关运行掩码的更多信息,请参阅系统架构指南的多核处理一章,以及《QNX中微子程序员指南》中的多核处理章节。

SLM:stderr

<SLM:stderr [iomode="w[+]|a[+]"]> stderr_filename </SLM:stderr>
  • iomode="w[+]|a[+]"

    The access mode: overwrite (w), read and overwrite (w+; default), append (a), or read and append (a+).

    访问方式:重写(w), 读取和重写 (w+;默认值)、追加(a)或读取并追加(a+)。

  • stderr_filename

    标准错误流(stderr)重定向到的文件名。

SLM:stdin

<SLM:stdin [iomode="r[+]"]> stdin_filename </SLM:stdin>
  • iomode="r[+]"

    访问方式:只读(r)或读写(r+)。

  • stdin_filename

    标准输入(stdin)重定向到的文件名称。

SLM:stdout

<SLM:stdout [iomode="w|a"]> stdout_filename </SLM:stdout>
  • iomode="w|a"

    The access mode: overwrite (w) or append (a).

    访问方式:重写(w)或追加(a)。

  • stdout_filename

    标准输出(stdout)重定向到的文件名。

SLM:stop

<SLM:stop 
        [stop="none|signal"] [child="false|true"] [timeout="timeout_time"]>
        stop_data </SLM:stop>
  • stop="none|signal"

    The signal setting (the default) causes SLM to send a signal number or name to the underlying process. The none setting disables the signaling; in this case, SLM takes no action to stop a process.

    signal(默认值)导致SLM向底层进程发送信号号或名称。

    none设置禁用信令;在这种情况下,SLM不采取任何行动停止进程。

  • child="false|true"

    When set to false (the default), no child of the process is terminated. When set to true, SLM uses application groups to reliably terminate all children of the process before it terminates the process itself.

    当设置为false(默认值)时,进程的任何子进程都不会终止。

    当设置为true时,SLM使用应用程序组在终止进程本身之前可靠地终止该进程的所有子进程。

  • timeout="timeout_time"

    试图顺利停止进程的最大时间,以毫秒为单位。如果进程不能很好地停止,则向它发送SIGKILL。如果没有超时,请指定0(默认值)。

  • stop_data

    Contains the signal number or name to send the process to stop it. By default, SIGTERM is sent, but you can change this to any signal. Because a signal name does not need to begin with "SIG", all of the following example values are valid:15TERMSIGTERM

    包含发送进程以停止它的信号号或名称。默认情况下,发送SIGTERM,但您可以将其更改为任何信号。因为信号名称不需要以“SIG”开头,所以以下所有的示例值都是有效的:15TERMSIGTERM

    名称字符串不区分大小写。

    如果多次尝试停止进程失败,则发送SIGKILL。

    当stop属性设置为none时,不需要这个元素值。

SLM:tty

<SLM:tty> tty_filename </SLM:tty>
  • tty_filename

    当进程作为会话leader打开时,stderr、stdin和stdout重定向到的文件名。

SLM:type

<SLM:type> type_name </SLM:type>
  • type_name

    启动组件的安全类型的名称。名称是反映执行的安全策略的标签。通常,您应该根据您想要发布的内容来选择名称。有关安全策略的信息,请参阅安全开发人员指南中的“安全策略”章节。

SLM:user

<SLM:user> uid|:gid|uid:gid </SLM:user>
  • uid|:gid|uid:gid

    将用户ID (UID)、组ID (GID)或两者同时分配给底层进程。可以是在/etc/passwd/etc/group中查找的名称。

SLM:waitfor

<SLM:waitfor [wait="none|delay|pathname|exists|blocks"]
                 [ polltime=poll_time:timeout_time]> waitfor_data </SLM:waitfor>
  • wait="none|delay|pathname|exists|blocks"

    Once a component has been launched, SLM can wait for that component to set itself up before starting any dependent components. Values:none (the default)—Causes SLM to start other dependent components immediately.delay—SLM pauses for the specified number of milliseconds before it starts the dependent components.pathname—SLM probes for the appearance of the specified pathname.exits—SLM waits for the process to exit with the specified exit code. If the exit code is different from the expected one, SLM restarts the process.blocks—SLM waits for a specified thread in the process to reach the RECV-blocked state.

    一旦启动了一个组件,SLM可以等待该组件进行自我设置,然后再启动任何依赖的组件。

    取值范围:

    none(默认值)-导致SLM立即启动其他依赖的组件。

    delay - SLM在启动其他依赖的组件之前会暂停指定的毫秒数。

    pathname - slm探测指定路径名的出现。

    exits-SLM等待进程使用指定的退出代码退出。如果退出码与预期的不同,SLM将重新启动该进程。

    blocks-SLM等待进程中指定的线程到达recv阻塞状态。

  • polltime=poll_time:timeout_time

    Use with wait="pathname" or wait="exits" to specify a polling interval and total wait time (both in milliseconds) that override the global values.For example, polltime="100:20000" results in polling every 100 milliseconds and timing out after 20 seconds.

    使用wait="pathname"wait="exits"指定覆盖全局值的轮询间隔和总等待时间(均以毫秒为单位)。例如,polltime="100:20000"会导致每100毫秒进行一次轮询,20秒后会超时。

  • waitfor_data

    包含指定等待条件的数据:

    none—不需要数据。

    delay—以毫秒为单位的时间(例如,5000用于5秒的延迟)。

    pathname -路径。blocks—一个线程ID。

组件

可以将组件分组到模块中。模块中的流程可以组成一个子系统,也可以用于建立一组系统状态,比如操作的基本级别和各种更高级别。模块必须被命名,这样它们才能被内部引用。每个模块必须在一个元素中描述,如下所示:

<SLM:module name="device_monitors">
    -- module description --
</SLM:module>

要列出模块中的组件,请使用成员元素。成员元素没有属性;元素值通过各自组件元素中定义的内部名称引用成员组件。模块不能包含依赖元素。

通过在组件名称中使用通配符的一个成员元素,可以在一个模块中包含多个组件。例如,你可以这样写:

<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配置文件中,你可以定义一个名为reusemodule的实体,然后包含它:

<!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 on 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> 
    

下面的例子展示了如何使用内置选项来调用一个内置的SLM函数(system()),并使用args元素传递参数给它:

<SLM:component name="root-fs">
     <SLM:depend>mount-fs</SLM:depend>    
     <SLM:command launch="builtin">system</SLM:command>
     <SLM:args>setconf _CS_HOSTNAME __HOSTNAME__</SLM:args>
</SLM:component>

正常终止与异常终止

SLM considers a process to have terminated normally in the following situations only:

SLM认为一个进程只有在下列情况下才正常终止:

  • SLM终止一个组件的进程是因为:

    • 通过执行SLMCTL停止组件创建了一个停止操作。

    • 依赖项需要SLM来停止组件的进程。

  • 该组件配置了一个waitfor=exits,并且该组件的进程将使用预期的退出代码退出。

所有其他进程的终止都被认为是异常的,并导致SLM重新启动组件的进程。如果某个进程在一段时间内死亡过于频繁,SLM就会停止尝试重新启动该进程,即使终止过程是异常的。

相关参考

on

restart

slmctl

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值