本文用于说明android的init.rc中使用的mini-language。主要的参考资料是代码目录中的readme(
其实只是做了个翻译,方便查询)。
* 总体规则
init语言是面向行的,每一行包括一个语句。语句包含由空白字符分隔的多个token。如果想在一个token
中包含空白字符,可以用`\’转义,或者将包含空白字符的token包含在双引号中。在行末的`\'用于折行。
以`#'开始的行(前面可以有空白字符)表示注释。
语句大体上分为四类:
1. 动作(action);
2. 命令(Command);
3. 服务(Service);
4. 选项(Option);
Action和Service的声明会开始一个新的区段(section),后续所有command和option语句都属于最近的那个
区段,在第一个区段之前的语句被忽略;动作和服务的名字应该保持唯一。
* 动作
动作是一个命名的命令组。动作有一个触发器,该触发器决定了这组命令什么时候应该执行。动作的形式
类似于:
on
...
* 服务
服务是这样一类程序,它们由init启动,并且,如果它们退出,init会重启它们。它们形如:
...
* 选项
选项是服务的修饰符,它们决定了init什么时候、怎么样运行被修饰的服务。
** 常见选项
1. cirtical:关键服务,如果这种服务在4分钟内退出的次数超过了4次,设备将会被重启到recovery模式;
2. disabled:禁用的服务,不会被自动启动。
3. setenv :启动时为这个服务设置环境变量。
4. socket
[ []]:创建一个unix socket,路径为 /dev/socket/,并且将该socket的fd传递给被启动的进程。用户和组默认为01;
5. user :使用指定的用户执行服务;
6. grou []*:使用指定的组来执行服务;
7. oneshot:如果服务退出,不要自动重启它;
8. class :为该服务指定一个类别名。一个类别中的服务可以被同时启动或者停止,如果没有指定,
则服务的类别是default。
9. onrestart:重启服务之前执行一个命令。
* 触发器
触发器用于匹配某些事件,当时间发生时,出发命令的执行。
** 常见触发器
1. boot:在init加载init.rc之后的第一个事件;
2. =:当属性被设置为值时;
3. device-added-
/device-removed-:当指定的设备节点被创建或删除时; 4. service-exited-:当指定的服务退出时
* 属性
这是init支持的一些“系统属性”,不同于环境变量。init会自动更新一些系统属性:
1. init.action:等于当前正在执行的action或"";
2. init.command:等于当前正在执行的command或"";
3. init.svc.:指定服务的状态,如running, stopped, restarting;
* 命令
init支持一组命令:
创建一个新进程并执行一个程序(
)。在程序完全执行前,init将会阻塞等待。注意,这可能 一起init永远阻塞等待,应尽量避免使用exec。
2. export
在全局环境变量中设在环境变量为。
3 ifup
启动网络接口
4. import
解析一个init配置文件,扩展当前配置。
5. hostname
设置主机名。
更改文件访问权限。
更改文件的所有者和组。
8. class_start
启动所有指定服务类下的未运行服务。
9. class_stop
停止指定服务类下的所有已运行的服务。
9. domainname
设置域名。
11. mkdir
[mode] [owner] [group] 创建一个目录
,可以选择性地指定mode、owner以及group。如果没有指定,默认的权限为755, 并属于root用户和root组。
12. mount [ ]*
试图在目录
挂载指定的设备。 可以是以 mtd@name 的形式指定一个mtd块设备。 包括 "ro"、"rw"、"remount"、"noatime"、 ...
13. setkey
目前不可用
14. setprop
设置系统属性 为 值.
15. setrlimit
设置的rlimit(资源限制)。
16. start
启动指定服务(如果此服务还未运行)。
17. stop
停止指定服务(如果此服务在运行中)。
19. sysclktz
设置系统时钟基准(0代表时钟滴答以格林威治时(GMT)为准)
20. trigger
触发一个事件。
阅读(1413) | 评论(0) | 转发(0) |