API/rc/zh: Difference between revisions
imported>OCDoc Import Imported from legacy OpenComputers documentation at ocdoc.cil.li |
Clean up Markdown artifacts from DokuWiki migration |
||
| Line 15: | Line 15: | ||
=== 最简配置 === | === 最简配置 === | ||
要创建一个名为"custom"的RC脚本,你至少需要一个文件: | 要创建一个名为"custom"的RC脚本,你至少需要一个文件:<code>/etc/rc.d/custom.lua</code>,其中至少定义一个函数。 | ||
<syntaxhighlight lang="lua"> | |||
function start() end | |||
</syntaxhighlight> | |||
这个仅包含一个 | 这个仅包含一个<code>start</code>函数的<code>custom.lua</code>文件已经足以定义一个RC脚本了。 | ||
善于观察的读者会发现,上述最简样例中的 | 善于观察的读者会发现,上述最简样例中的<code>start</code>函数并未指定<code>local</code>作用域。这是故意而为的。RC脚本会被加载到沙盒环境中,这些全局函数就充当了调用来源与RC控制器之间的接口。你脚本中所有你想让RC控制器访问的方法都必须定义为全局方法。 | ||
OpenOS自带一份RC脚本的样例,请查看 | OpenOS自带一份RC脚本的样例,请查看<code>/etc/rc.d/example.lua</code>。 | ||
=== RC脚本方法 === | === RC脚本方法 === | ||
对一般读者而言,有关RC脚本环境细节的内容似乎偏离了RC系统入门的主题。但对于好奇或者有疑问的读者而言,这些信息会有所帮助。RC脚本会被(用lua的 | 对一般读者而言,有关RC脚本环境细节的内容似乎偏离了RC系统入门的主题。但对于好奇或者有疑问的读者而言,这些信息会有所帮助。RC脚本会被(用lua的<code>load</code>函数)加载到一个继承了所有OpenOS全局方法的沙箱环境中。你在RC脚本中编写的全局函数只能从RC系统中访问,不会污染OpenOS全局环境。你脚本的[[API/rc/zh#RC脚本配置|配置]]同样位于沙箱环境中,以全局变量<code>args</code>的形式存在。同时还应注意,你的脚本只会加载一次,此后会保存在缓存中。 | ||
RC脚本名称是指你添加到 | RC脚本名称是指你添加到<code>/etc/rc.d/</code>目录的lua文件名(不含后缀)。 | ||
请在RC脚本文件中把你的RC方法定义为全局函数。请注意,RC系统在任何情况下都不会对RC脚本方法的返回值作出任何响应。异常所抛出的任何数据都会被输出到stderr,如果stderr不可用则会输出到 | 请在RC脚本文件中把你的RC方法定义为全局函数。请注意,RC系统在任何情况下都不会对RC脚本方法的返回值作出任何响应。异常所抛出的任何数据都会被输出到stderr,如果stderr不可用则会输出到<code>/tmp/event.log</code>。 | ||
在RC系统中,只有两个RC方法具有特殊地位: | 在RC系统中,只有两个RC方法具有特殊地位:<code>start</code>和<code>stop</code>。 | ||
* | * <code>start()</code> | ||
<pre> | <pre>一个正常的RC脚本中只需定义一个start方法。RC系统在设计时假定RC脚本都是可被启动的。并且在涉及[[API/rc/zh#RC控制器|控制器]]的多种工作流中,系统都会利用start方法。 | ||
</pre> | </pre> | ||
* | * <code>stop()</code> | ||
<pre> | <pre>RC脚本中可以定义一个停止方法(可选)。启用的RC脚本(即配置为自动启动的脚本)只会在系统启动时调用start方法,但假如脚本定义了stop方法,那么rc <脚本名> restart会有如下的默认行为。 | ||
如果RC控制器被要求restart(重启)某个脚本,它会先调用stop方法,紧接着调用start方法。请注意若脚本中显式定义了restart方法,则控制器会调用定义的方法,而不是执行前文的默认行为。 | |||
</pre> | </pre> | ||
* | * <code><方法名>([参数...])</code> | ||
<pre> | <pre>编写RC脚本时不仅可以定义start和stop方法,还可以定义任意多的方法。用户不会直接调用这些方法,而是利用RC控制器来间接调用它们。因此有了下文所示的通用调用语法,RC控制器可用其调用任意名称的RC脚本方法。 | ||
</pre> | </pre> | ||
<code>rc <模块名> <方法名> [参数...]</code> 此处的<code>模块名</code>指你的RC脚本名称(即位于你的<code>/etc/rc.d/</code>目录下的<code>.lua</code>文件名,不含后缀)。<code>方法名</code>指你在脚本文件中定义的全局方法。<code>参数...</code>是你想传递的任意命令行参数。甚至<code>start</code>和<code>stop</code>方法也可通过此方式调用。 | |||
=== RC脚本配置 === | === RC脚本配置 === | ||
你可以在 | 你可以在<code>/etc/rc.cfg</code>文件中定义自己的脚本配置(语法必须符合lua可读取的标准)。假设你的RC脚本位置在<code>/etc/rc.d/foo.lua</code>,则其模块名为<code>foo</code>,其在配置文件中的字段名称(键名)也需要为<code>foo</code>。OpenOS提供的样例RC脚本<code>example</code>也涉及了这一点。此模块的脚本文件为<code>/etc/rc.d/example.lua</code>,同时<code>/etc/rc.cfg</code>配置文件中有: | ||
<syntaxhighlight lang="lua"> | |||
example = "Hello World" enabled = {} | |||
</syntaxhighlight> | |||
<code>enabled</code>列表由[[API/rc/zh#RC控制器|控制器]]维护,但<code>example</code>字段中存储的是<code>example</code>RC脚本的配置。字段的值可以是任何lua值,不只是字符串。当然也包含表。脚本的配置值会被加载到你的脚本环境中。在脚本中你可以通过名为<code>args</code>的全局字段来访问你的配置。请再回头查看<code>example.lua</code>脚本的代码,注意它对<code>args</code>变量的用法。你的脚本和配置只会由控制器加载和缓存一次。 | |||
== RC控制器 == | == RC控制器 == | ||
RC控制器提供了一个命令行接口,你可以在shell中通过 | RC控制器提供了一个命令行接口,你可以在shell中通过<code>rc</code>命令(<code>/bin/rc.lua</code>)访问。还提供了一个运行库,你可以通过<code>require("rc")</code>来访问。 RC控制器维护着一份列表,表中记录了配置为开机时执行的RC脚本。RC控制器中还缓存了已加载的RC脚本。 不像其他自启动方案,如autorun和<code>.shrc</code>,启用的RC脚本只会在OpenOS启动时自动执行一次。 | ||
=== 命令行接口 === | === 命令行接口 === | ||
<code>rc</code> 调用所有启用的RC脚本的<code>start</code>方法。 | |||
<code>rc <模块名> enable</code> 将名为<模块名>的RC脚本添加到“自启动”RC脚本的列表中。下次开机启动时将会自动调用<模块名>.start()。 | |||
<code>rc <模块名> disable</code> 将名为<模块名>的RC脚本从“自启动”RC脚本的列表中移除。下次启动时名为<模块名>的脚本不会自启动。 | |||
<code>rc <模块名> restart</code> 若名为<模块名>的脚本同时定义了<code>stop()</code>和<code>start()</code>方法,则依次调用它们。 | |||
<code>rc <模块名> <方法名> [参数...]</code> 调用名为<模块名>的RC脚本中定义的<方法名>方法,如果有[参数...],则将它们作为函数参数传递给此方法。 | |||
=== RC API === | === RC API === | ||
* | * <code>unload(moduleName: string)</code> | ||
<pre>你可以卸载RC脚本,以将其从RC缓存中移除。此功能可用于重置配置文件,或是清理脚本的全局定义。在调试时此功能用处极大,你可以在不重启电脑的前提下重新加载脚本代码。 | <pre>你可以卸载RC脚本,以将其从RC缓存中移除。此功能可用于重置配置文件,或是清理脚本的全局定义。在调试时此功能用处极大,你可以在不重启电脑的前提下重新加载脚本代码。 | ||
| Line 81: | Line 85: | ||
{{:API/contents/zh}} | {{:API/contents/zh}} | ||
Latest revision as of 20:26, 24 August 2026
RC API
RC系统以服务的形式自动运行脚本,它主要用于在系统启动时自动执行脚本。RC系统是OpenOS提供的众多自动执行脚本工具之一,其余可参阅此页面。
OpenOS的RC系统受到了OpenRC的启发。"RC"的含义是"run command"(运行指令)。
RC脚本
RC脚本是由用户编写,并由RC控制器管理的lua模块。此百科将讲述如何编写你自己的RC脚本。 "启用的"RC脚本指被配置为开机启动的脚本。RC控制器也可以单独启动或停止某个RC脚本的运行,无需启用或禁用此脚本。
RC脚本至少需要满足最简配置。它们的方法API很灵活,并且可以配合RC脚本配置使用。
最简配置
要创建一个名为"custom"的RC脚本,你至少需要一个文件:/etc/rc.d/custom.lua,其中至少定义一个函数。
function start() end这个仅包含一个start函数的custom.lua文件已经足以定义一个RC脚本了。
善于观察的读者会发现,上述最简样例中的start函数并未指定local作用域。这是故意而为的。RC脚本会被加载到沙盒环境中,这些全局函数就充当了调用来源与RC控制器之间的接口。你脚本中所有你想让RC控制器访问的方法都必须定义为全局方法。
OpenOS自带一份RC脚本的样例,请查看/etc/rc.d/example.lua。
RC脚本方法
对一般读者而言,有关RC脚本环境细节的内容似乎偏离了RC系统入门的主题。但对于好奇或者有疑问的读者而言,这些信息会有所帮助。RC脚本会被(用lua的load函数)加载到一个继承了所有OpenOS全局方法的沙箱环境中。你在RC脚本中编写的全局函数只能从RC系统中访问,不会污染OpenOS全局环境。你脚本的配置同样位于沙箱环境中,以全局变量args的形式存在。同时还应注意,你的脚本只会加载一次,此后会保存在缓存中。
RC脚本名称是指你添加到/etc/rc.d/目录的lua文件名(不含后缀)。
请在RC脚本文件中把你的RC方法定义为全局函数。请注意,RC系统在任何情况下都不会对RC脚本方法的返回值作出任何响应。异常所抛出的任何数据都会被输出到stderr,如果stderr不可用则会输出到/tmp/event.log。
在RC系统中,只有两个RC方法具有特殊地位:start和stop。
start()
一个正常的RC脚本中只需定义一个start方法。RC系统在设计时假定RC脚本都是可被启动的。并且在涉及[[API/rc/zh#RC控制器|控制器]]的多种工作流中,系统都会利用start方法。
stop()
RC脚本中可以定义一个停止方法(可选)。启用的RC脚本(即配置为自动启动的脚本)只会在系统启动时调用start方法,但假如脚本定义了stop方法,那么rc <脚本名> restart会有如下的默认行为。 如果RC控制器被要求restart(重启)某个脚本,它会先调用stop方法,紧接着调用start方法。请注意若脚本中显式定义了restart方法,则控制器会调用定义的方法,而不是执行前文的默认行为。
<方法名>([参数...])
编写RC脚本时不仅可以定义start和stop方法,还可以定义任意多的方法。用户不会直接调用这些方法,而是利用RC控制器来间接调用它们。因此有了下文所示的通用调用语法,RC控制器可用其调用任意名称的RC脚本方法。
rc <模块名> <方法名> [参数...] 此处的模块名指你的RC脚本名称(即位于你的/etc/rc.d/目录下的.lua文件名,不含后缀)。方法名指你在脚本文件中定义的全局方法。参数...是你想传递的任意命令行参数。甚至start和stop方法也可通过此方式调用。
RC脚本配置
你可以在/etc/rc.cfg文件中定义自己的脚本配置(语法必须符合lua可读取的标准)。假设你的RC脚本位置在/etc/rc.d/foo.lua,则其模块名为foo,其在配置文件中的字段名称(键名)也需要为foo。OpenOS提供的样例RC脚本example也涉及了这一点。此模块的脚本文件为/etc/rc.d/example.lua,同时/etc/rc.cfg配置文件中有:
example = "Hello World" enabled = {}enabled列表由控制器维护,但example字段中存储的是exampleRC脚本的配置。字段的值可以是任何lua值,不只是字符串。当然也包含表。脚本的配置值会被加载到你的脚本环境中。在脚本中你可以通过名为args的全局字段来访问你的配置。请再回头查看example.lua脚本的代码,注意它对args变量的用法。你的脚本和配置只会由控制器加载和缓存一次。
RC控制器
RC控制器提供了一个命令行接口,你可以在shell中通过rc命令(/bin/rc.lua)访问。还提供了一个运行库,你可以通过require("rc")来访问。 RC控制器维护着一份列表,表中记录了配置为开机时执行的RC脚本。RC控制器中还缓存了已加载的RC脚本。 不像其他自启动方案,如autorun和.shrc,启用的RC脚本只会在OpenOS启动时自动执行一次。
命令行接口
rc 调用所有启用的RC脚本的start方法。
rc <模块名> enable 将名为<模块名>的RC脚本添加到“自启动”RC脚本的列表中。下次开机启动时将会自动调用<模块名>.start()。
rc <模块名> disable 将名为<模块名>的RC脚本从“自启动”RC脚本的列表中移除。下次启动时名为<模块名>的脚本不会自启动。
rc <模块名> restart 若名为<模块名>的脚本同时定义了stop()和start()方法,则依次调用它们。
rc <模块名> <方法名> [参数...] 调用名为<模块名>的RC脚本中定义的<方法名>方法,如果有[参数...],则将它们作为函数参数传递给此方法。
RC API
unload(moduleName: string)
你可以卸载RC脚本,以将其从RC缓存中移除。此功能可用于重置配置文件,或是清理脚本的全局定义。在调试时此功能用处极大,你可以在不重启电脑的前提下重新加载脚本代码。
目录
| < 100% 15% 15% > | ||
| API | OpenOS | buffer - colors - component - computer - event - filesystem - uuid - internet - keyboard - note - process - rc - robot - serialization - shell - sides - term - text - thread - transforms - unicode |
| ::: | Lua 库 | coroutine - package - io - os |