init进程是Android系统中用户空间的第一个进程,进程ID为1,源代码位于system/core/init 目录。作为Android系统的第一个进程,Init进程承担这很多重要的初始化任务,一般Init进程的初始化可以分为两部分,前半部分挂载文件系统,初始化属性系统和Klog, selinux的初始化等,后半部分重要通过解析init.rc来初始化系统daemon服务进程,然后以epoll的监控属性文件,系统信号等。
init.rc则是init进程启动的配置脚本,这个脚本是用一种叫Android Init Language(Android初始化语言)的语言写的。在7.0以前,init进程只解析根目录下的init.rc文件,但是随着版本的迭代,init.rc越来越臃肿,在7.0以后,init.rc一些业务被拆分到
/system/etc/init
/vendor/etc/init
/odm/etc/init
三个目录下。
AIL包括四种类型的语句:
语法特性
Actions是被命名的命令(Commands)序列,由trigger(触发器)来决定这个actions什么时候发生,当一个时间触发了一个符合的action触发器,这个action就会被添加到处理队列尾部(它已经存在在对列除外)。
在处理队列中每一个action都按照排序出列,action中的command也按照顺序执行:
on <trigger> ##触发条件
<command> ##执行命令
<command> ##可以同时执行多个命令
<command>
trigger
init.rc中常见的trigger如下:
| trigger(触发器) | 功能 |
|-|-|
| boot | 这是init启动时(加载/init.conf之后)发生的第一个触发器。|
| <name>=<value> | 当属性<name>设置为特定值<value>时,会触发此触发器 |
| device-added-<path>
device-removed-<path> | 当添加或删除设备节点时,会触发这些触发器。|
| service-exited-<name> | 当指定服务退出时,将触发这些触发器。|
两种常见的Action定义代码:
#当init被触发时执行
on init
<command>
...
#当属性sys.boot_completed被设置为1时执行
on property:sys.boot_completed=1
<command1>
在写shell脚本的时候发现cd切换目录的时候无法切换,还是在当前目录下,这是什么原因呢?
#!/bin/bash
TOP=`pwd`
cd ${TOP}/../XXXXX/rcar-xos/v3.3.0/
ls -l
可以使用下述命令去执行我们的脚本即可。
# way - 1
$ source xxx.sh
# way - 2
# note: . ./xxx.sh .和.中间有个空格!
$ . ./xxx.sh
command | description |
---|---|
screen -S yourname | # 新建一个叫yourname的session |
screen -ls | # 列出当前所有的session |
screen -r yourname | # 回到yourname这个session |
screen -d yourname | # 远程detach某个session |
screen -d -r yourname | # 结束当前session并回到yourname这个session |
echo $STY | 查看自己是不是在screen里边. 如果回显是空的,那么就是在真·终端里,否则会显示当前的screen ID |
# C-a d # detach
# screen -ls # list session
# screen -d # detach session
# screen -r 12865 # recall session
# screen -S 7311 -X quit # kill session
当然,如果你在另一台机器上没有分离一个Screen会话,就无从恢复会话了。
这时可以使用下面命令强制将这个会话从它所在的终端分离,转移到新的终端上来:
# screen -r 12865 # recall session
# screen -d 12865 # detach session
# screen -r 12865 # recall session
利用ctrl-a [ 进入copy mode,即可查看。