**This is an old revision of the document!**

RC API

RC系统将脚本作为服务自动运行,主要用于在系统启动时自动执行脚本。它是OpenOS提供的众多自动执行脚本工具之一,其余可参阅此页面

OpenOS的RC系统受到了OpenRC的启发。“RC”的含义是“run command”(运行指令)。

RC系统由两大部分组成:RC脚本RC控制器.

RC脚本

RC脚本是由用户编写,并由RC控制器管理的lua模块。此百科将讲述如何编写你自己的RC脚本。 “被启用的”RC脚本指被配置为开机启动的脚本。RC控制器还可以单独启动或停止某个RC脚本,而无需启用或禁用此脚本。

RC脚本至少需要满足最简配置。它们的方法api很灵活,并且可以配合RC脚本配置使用。

最简配置

要编写一个名为“custom”的rc脚本,你至少需要一个文件:/etc/rc.d/custom.lua,其中至少定义一个函数

snippet.lua
function start()
end

这个custom.lua文件,和它的start函数已经足以定义一个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

There are only 2 rc methods that hold a special status in the rc system, start and stop.

  • start()

一个正常的rc脚本中只需要定义一个start方法。rc系统在设计时假定rc脚本是可以被启动的,并且在控制器的多种工作流中,系统只会利用start方法。

  • stop()

rc脚本中可以可选的定义一个停止方法。被启用的rc脚本(也即配置为自动启动的脚本)只会在启动时调用start方法,但是rc <脚本名> restart在脚本的stop方法有定义时也有默认行为:如果rc控制器被要求restart某个脚本,它会先调用stop方法,紧接着调用start方法。请注意如果脚本中明确定义了restart方法,则控制器会调用此方法,而不是前文的默认行为。

  • <方法名>([参数...])

编写rc脚本时可以不仅限于定义startstop方法,而是可以定义任意数量的方法。用户不会直接调用这些方法,而是会利用rc控制器来调用。因此我们提供了此语法,rc控制器可以用其调用任意名称的rc脚本方法。

# rc <模块名> <方法名> [参数...]

此处的模组名指你的rc脚本名称(即位于你的/etc/rc.d/目录下的.lua文件名,不含后缀)。方法名指你在脚本文件中定义的全局方法。参数...是你想传递的任意命令行参数。startstop方法也可以以此方式调用。

RC脚本配置

你可以在/etc/rc.cfg文件中自定义脚本配置 (文件的语法必须可被lua读取)。假设你的rc脚本位置为/etc/rc.d/foo.lua,则此模块的名称为foo,其在配置文件中的域(field)名称也需要为foo。OpenOS提供的样例rc脚本example也涉及了这一点。模块包含/etc/rc.d/example.lua脚本文件,并且/etc/rc.cfg配置文件中有:

snippet.lua
example = "Hello World"
enabled = {}

enabled列表由controller维护,但是example域(field)中存储的是examplerc脚本的配置。领域的值可以是任何lua值,不只是字符串。当然也包含列表。你脚本的配置值会被加载到你的脚本环境中。在你的脚本中你可以通过名为args的全局域(field)访问你的配置。请再回头查看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缓存中移除。此功能用于重置配置文件或是清理脚本全局变量。在调试时此功能用处极大,你可以在不重启电脑的前提下重新加载脚本代码

目录