Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revision Both sides next revision
api:rc:zh [2023/11/30 07:18]
hfsr [最简配置]
api:rc:zh [2023/11/30 08:01]
hfsr [命令行界面]
Line 29: Line 29:
 ==== RC脚本方法 ==== ==== RC脚本方法 ====
  
-对一般读者而言,有关RC脚本环境细节的内容似乎偏离了RC系统入门的主题。但对于好奇或者有疑问的读者而言,这些信息会有所帮助。RC脚本会被加载(lua `load`)到一个继承了所有OpenOS全局方法的沙箱环境中。你在RC脚本中编写的全局函数只能从RC系统中访问,不会污染OpenOS全局环境。你脚本[[api:​rc:​zh#​RC脚本配置|配置]]同样位于沙箱环境中,以全局变量`args`的形式存在。同时还应注意,你的脚本只会加载一次,此后会保存在缓存中。+对一般读者而言,有关RC脚本环境细节的内容似乎偏离了RC系统入门的主题。但对于好奇或者有疑问的读者而言,这些信息会有所帮助。RC脚本会被(用lua`load`函数)加载到一个继承了所有OpenOS全局方法的沙箱环境中。你在RC脚本中编写的全局函数只能从RC系统中访问,不会污染OpenOS全局环境。你脚本[[api:​rc:​zh#​RC脚本配置|配置]]同样位于沙箱环境中,以全局变量`args`的形式存在。同时还应注意,你的脚本只会加载一次,此后会保存在缓存中。
  
-RC脚本名称是指你添加到`/​etc/​rc.d/​`目录的lua文件名(不含后缀)+RC脚本名称是指你添加到`/​etc/​rc.d/​`目录的lua文件名不含后缀
  
 请在RC脚本文件中把你的RC方法定义为全局函数。请注意,RC系统在任何情况下都不会对RC脚本方法的返回值作出任何响应。异常所抛出的任何数据都会被输出到stderr,如果stderr不可用则会输出到`/​tmp/​event.log`。 请在RC脚本文件中把你的RC方法定义为全局函数。请注意,RC系统在任何情况下都不会对RC脚本方法的返回值作出任何响应。异常所抛出的任何数据都会被输出到stderr,如果stderr不可用则会输出到`/​tmp/​event.log`。
Line 37: Line 37:
 在RC系统中,只有两个RC方法具有特殊地位:`start`和`stop`。 在RC系统中,只有两个RC方法具有特殊地位:`start`和`stop`。
  
-- `start()` +- `start()` ​  
- +  一个正常的RC脚本中只需定义一个`start`方法。RC系统在设计时假定RC脚本都是可被启动的。并且在涉及[[api:​rc:​zh#​RC控制器|控制器]]的多种工作流中,系统会利用`start`方法。 ​  
-一个正常的RC脚本中只需定义一个`start`方法。RC系统在设计时假定RC脚本都是可被启动的。并且在[[api:​rc:​zh#​RC控制器|控制器]]的多种工作流中,系统会利用`start`方法。 +\\ 
- +- `stop()` ​  
-- `stop()` +  RC脚本中可以定义一个停止方法可选。启用的RC脚本即配置为自动启动的脚本只会在系统启动时调用`start`方法,但假如脚本定义了`stop`方法,那么`rc <​脚本名>​ restart`如下的默认行为。   
- +  ​如果RC控制器被要求`restart`重启某个脚本,它会先调用`stop`方法,紧接着调用`start`方法。请注意脚本中显式定义了`restart`方法,则控制器会调用定义的方法,而不是执行前文的默认行为。 ​  
-RC脚本中可以定义一个停止方法(可选)启用的RC脚本(也即配置为自动启动的脚本)只会在系统启动时调用`start`方法,但`rc <​脚本名>​ restart`在脚本的`stop`方法有定义时具有默认行为如果RC控制器被要求`restart`(重启)某个脚本,它会先调用`stop`方法,紧接着调用`start`方法。请注意如果脚本中明确定义了`restart`方法,则控制器会调用方法,而不是执行前文的默认行为。 +\\ 
- +- `<​方法名>​([参数...])` ​  
-- `<​方法名>​([参数...])` +  编写RC脚本时不仅可以定义`start`和`stop`方法,还可以定义任意多的方法。用户不会直接调用这些方法,而是利用RC控制器来间接调用它们。因此下文所示的通用调用语法,RC控制器可用其调用任意名称的RC脚本方法。 ​  
- +`rc <​模块名>​ <​方法名>​ [参数...]` ​  
-编写RC脚本时不仅可以定义`start`和`stop`方法,还可以定义任意多的方法。用户不会直接调用这些方法,而是利用RC控制器来调用它们。因此我们提供语法,RC控制器可用其调用任意名称的RC脚本方法。 +此处的`模名`指你的RC脚本名称即位于你的`/​etc/​rc.d/​`目录下的`.lua`文件名,不含后缀。`方法名`指你在脚本文件中定义的全局方法。`参数...`是你想传递的任意命令行参数。甚至`start`和`stop`方法也可通过此方式调用。
- +
-`rc <​模块名>​ <​方法名>​ [参数...]` +
- +
-此处的`模名`指你的RC脚本名称(即位于你的`/​etc/​rc.d/​`目录下的`.lua`文件名,不含后缀)。`方法名`指你在脚本文件中定义的全局方法。`参数...`是你想传递的任意命令行参数。`start`和`stop`方法也可以用此方式调用。+
  
 ==== RC脚本配置 ==== ==== RC脚本配置 ====
  
-你可以在`/​etc/​rc.cfg`文件中定义脚本配置 ​(语法必须符合lua可读取的标准)。假设你的RC脚本位置在`/​etc/​rc.d/​foo.lua`,则模块为`foo`,其在配置文件中的字段名称(键名)也需要为`foo`。OpenOS提供的样例RC脚本`example`也涉及了这一点。此模块的脚本文件为`/​etc/​rc.d/​example.lua`,同时`/​etc/​rc.cfg`配置文件中有:+你可以在`/​etc/​rc.cfg`文件中定义自己的脚本配置语法必须符合lua可读取的标准。假设你的RC脚本位置在`/​etc/​rc.d/​foo.lua`,则模块名为`foo`,其在配置文件中的字段名称(键名)也需要为`foo`。OpenOS提供的样例RC脚本`example`也涉及了这一点。此模块的脚本文件为`/​etc/​rc.d/​example.lua`,同时`/​etc/​rc.cfg`配置文件中有:
  
 ```lua ```lua
Line 62: Line 58:
 ``` ```
  
-`enabled`列表由[[api:​rc:​zh#​RC控制器|控制器]]维护,但`example`字段中存储的是`example`RC脚本的配置。字段的值可以是任何lua值,不只是字符串。当然也包含表。脚本的配置值会被加载到你的脚本环境中。在你的脚本中你可以通过的全局字段名称`args`来访问你的配置。请再回头查看`example.lua`脚本的代码,注意它对`args`变量的用法。你的脚本和配置只会由控制器加载和缓存一次。+`enabled`列表由[[api:​rc:​zh#​RC控制器|控制器]]维护,但`example`字段中存储的是`example`RC脚本的配置。字段的值可以是任何lua值,不只是字符串。当然也包含表。脚本的配置值会被加载到你的脚本环境中。在脚本中你可以通过名为`args`的全局字段来访问你的配置。请再回头查看`example.lua`脚本的代码,注意它对`args`变量的用法。你的脚本和配置只会由控制器加载和缓存一次。
  
 ===== RC控制器 ===== ===== RC控制器 =====
  
-RC控制器提供了一个命令行接口,你可以在shell中通过`rc`(`/​bin/​rc.lua`)访问。还提供了一个运行库,你可以通过`require("​rc"​)`来访问。 +RC控制器提供了一个命令行接口,你可以在shell中通过`rc``/​bin/​rc.lua`访问。还提供了一个运行库,你可以通过`require("​rc"​)`来访问。 ​  
-RC控制器维护着一份列表,表中记录了配置为开机时启动rc脚本。RC控制器中还缓存了已加载的RC脚本。 +RC控制器维护着一份列表,表中记录了配置为开机时执行RC脚本。RC控制器中还缓存了已加载的RC脚本。 ​  
-不像其他自启动设置,如autorun和`.shrc`,启用的RC脚本只会在OpenOS启动时自动执行一次。 +不像其他自启动方案,如autorun和`.shrc`,启用的RC脚本只会在OpenOS启动时自动执行一次。
- +
-==== 命令行界面 ==== +
- +
-`rc` +
- +
-调用所有被启用的RC脚本的`start`方法 +
- +
-`rc <​模块名>​ enable` +
- +
-将名为<​模块名>​的RC脚本添加到“自启动”RC脚本的列表中。下次开机启动时将会自动调用<​模块名>​.start()。 +
- +
-`rc <​模块名>​ disable` +
- +
-将名为<​模块名>​的RC脚本从“自启动”RC脚本的列表中移除。下次启动时名为<​模块名>​的脚本不会自启动。 +
- +
-`rc <​模块名>​ restart` +
- +
-如果名为<​模块名>​的脚本同时定义了`stop()`和`start()`方法,则依次调用它们+
  
-`rc <​模块名>​ <​方法名>​ [参数...]`+==== 命令行接口 ====
  
 +`rc`  ​
 +调用所有启用的RC脚本的`start`方法。  ​
 +\\
 +`rc <​模块名>​ enable`  ​
 +将名为<​模块名>​的RC脚本添加到“自启动”RC脚本的列表中。下次开机启动时将会自动调用<​模块名>​.start()。  ​
 +\\
 +`rc <​模块名>​ disable`  ​
 +将名为<​模块名>​的RC脚本从“自启动”RC脚本的列表中移除。下次启动时名为<​模块名>​的脚本不会自启动。  ​
 +\\
 +`rc <​模块名>​ restart`  ​
 +若名为<​模块名>​的脚本同时定义了`stop()`和`start()`方法,则依次调用它们。  ​
 +\\
 +`rc <​模块名>​ <​方法名>​ [参数...]`  ​
 调用名为<​模块名>​的RC脚本中定义的<​方法名>​方法,如果有[参数...],则将它们作为函数参数传递给此方法。 调用名为<​模块名>​的RC脚本中定义的<​方法名>​方法,如果有[参数...],则将它们作为函数参数传递给此方法。
 ==== RC API ==== ==== RC API ====