RC系统将脚本作为服务自动运行,主要用于在系统启动时自动执行脚本。它是OpenOS提供的众多自动执行脚本工具之一,其余可参阅此页面。
OpenOS的RC系统受到了OpenRC的启发。“RC”的含义是“run command”(运行指令)。
RC脚本是由用户编写,并由RC控制器管理的lua模块。此百科将讲述如何编写你自己的RC脚本。 “被启用的”RC脚本指被配置为开机启动的脚本。RC控制器还可以单独启动或停止某个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脚本会被加载(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脚本都是可以被启动的。并且在控制器的多种工作流中,系统只会利用start
方法。
stop()
RC脚本中可以定义一个停止方法(可选)。被启用的RC脚本(也即配置为自动启动的脚本)只会在系统启动时调用start
方法,但是rc <脚本名> restart
在脚本的stop
方法有定义时具有默认行为:如果RC控制器被要求restart
(重启)某个脚本,它会先调用stop
方法,紧接着调用start
方法。请注意如果脚本中明确定义了restart
方法,则控制器会调用此方法,而不是执行前文的默认行为。
<方法名>([参数...])
编写RC脚本时不仅可以定义start
和stop
方法,还可以定义任意多的方法。用户不会直接调用这些方法,而是会利用RC控制器来调用它们。因此我们提供了此语法,rc控制器可以用其调用任意名称的RC脚本方法。
# rc <模块名> <方法名> [参数...]
此处的模组名
指你的rc脚本名称(即位于你的/etc/rc.d/
目录下的.lua
文件名,不含后缀)。方法名
指你在脚本文件中定义的全局方法。参数...
是你想传递的任意命令行参数。start
和stop
方法也可以用此方式调用。
你可以在/etc/rc.cfg
文件中自定义脚本配置 (语法必须符合lua可读取的标准)。假设你的RC脚本位置在/etc/rc.d/foo.lua
,则此模块的名称为foo
,其在配置文件中的域(field,此处指配置数据中的一部分,具体而言为一个变量,变量名即为域名称)的名称也需要为foo
。OpenOS提供的样例RC脚本example
也涉及了这一点。此模块的脚本文件为/etc/rc.d/example.lua
,同时/etc/rc.cfg
配置文件中有:
example = "Hello World" enabled = {}
enabled
列表由控制器维护,但是example
域中存储的是example
RC脚本的配置。域中的值可以是任何lua值,不只是字符串。当然也包含列表。你脚本的配置值会被加载到你的脚本环境中。在你的脚本中你可以通过的全局域名称args
来访问你的配置。请再回头查看example.lua
脚本的代码,注意它对args
变量的用法。你的脚本和配置只会由控制器加载和缓存一次。
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脚本中定义的<方法名>方法,如果有[参数…],则将它们作为函数参数传递给此方法。
unload(moduleName: string)
你可以卸载你的rc脚本,同时它也会从rc缓存中移除。此功能用于重置配置文件或是清理脚本全局变量。在调试时此功能用处极大,你可以在不重启电脑的前提下重新加载脚本代码