在做项目过程中,时常添加一些启动脚本,但是对整个脚本的启动流程和规则缺乏理解,所以整理加深一下。
路径
etc/init.d/
etc/rc.d/
规则
#!/bin/sh 脚本解释器
/etc/rc.common 脚本执行前的检查脚本,可以检测出非法的参数
START=40 在etc/rc.d/生成S40xxx,在启动时按照数字从小到大执行
STOP=40 在etc/rc.d/生成K40xxx,在关闭时按照数字从大到小执行
boot 有boot时就不会执行start
#!/bin/sh /etc/rc.common
# Copyright (C) 2006 OpenWrt.org
START=40
STOP=40
boot() {
}
start() {
}
restart() {
}
stop() {
}
初始化
start # 启动服务
stop # 停止服务
restart # 重启服务
reload # 重新载入配置文件, 如果失败则重启
enable # 启用开机自启动
disable # 禁用开机自启动
enable 启动开机启动后会在etc/rc.d/下面建立链接文件指向etc/init.d/下面对应文件。
编译前,只在etc/init.d/下面添加了文件,编译后生成了etc/rc.d/下面的文件,有些没有被enable,是在哪儿设置的呢?
查看是否启动
for F in /etc/init.d/* ; do $F enabled && echo $F on || echo $F **disabled**; done
/etc/init.d/telnetd **disabled**
/etc/init.d/tigerface on
脚本加参数enabled返回0表示启动,返回1表示没有启用。
等同下面脚本:
#!/bin/sh
for F in /etc/init.d/*
do
$F enabled
if [ 0 -eq $? ] ;then
echo $F on
else
echo $F **disabled**
fi
done
原理分析:
启动脚本执行前会先执行/etc/rc.common,enable里面会检测/etc/rc.d/对应的文件是否可执行。
initscript="$1"
enabled() {
name="$(basename "${initscript}")"
[ -x "$IPKG_INSTROOT/etc/rc.d/S${START}${name##S[0-9][0-9]}" ]
}
启动后台
uds >/dev/null &,默认为1代表stdout标准输出,正常不会有打印,异常才会打印
uds 2>/dev/null >/dev/null,2代表stderr标准错误输出,只有命令返回异常的错误信息才会输入到后面,正常的信息会打印出来
注意
1、权限问题,etc/init.d/下文件需要有执行权限,否则不能启动脚本,且看到异常打印;