/etc/rc.common的解释【转】

(转自:https://blog.csdn.net/u012385733/article/details/84565446

 

1、在shell脚本的头部出现 "#!/bin/sh /etc/rc.common",如果该脚本为x.sh,如果执行命令为 ./x.sh parameters,即为运行 /etc/rc.common x.sh parameters,这说明 /etc/rc.common用于解析x.sh命令行参数

由于openwrt使用自己的初始script系统,所有的initscript必须使用/etc/rc.common作为wrapper安装在/etc/init.d/<name>下。

 

如/etc/init.d/httpd:

#!/bin/sh /etc/rc.common

# Copyright (C)2006 OpenWrt.org

START=50

start() {

    [ -d /www ] && httpd -p 80 -h /www-r OpenWrt

}

stop() {

    killall httpd

}

从上可以看出,script本身并不解析命令行参数,而是由/etc/rc.common来完成。

Start和stop是最基本的功能,几乎所有init script都要提供。Start是在运行/etc/init.d/httpdstart时来调用,可以是系统启动时,或用户手动运行此脚本时。

通过/etc/init.d/<name> enable/disable可以启用或禁止模块的初始化脚本,他是通过创建或删除/etc/rc.d中的符号连接来完成,而这些符号连接是/etc/init.d/rcS在启动阶段处理。

脚本运行的顺序是在初始脚本中通过变量START来定义,改变后需要再次运行/etc/init.d/<name>enable

  • /etc/rc.common说明
#!/bin/sh
# Copyright (C) 2006-2012 OpenWrt.org

. $IPKG_INSTROOT/lib/functions.sh
. $IPKG_INSTROOT/lib/functions/service.sh

initscript=$1
action=${2:-help}
shift 2

start() {
        return 0
}

stop() {
        return 0
}

reload() {
        return 1
}

restart() {
        trap '' TERM
        stop "$@"
        start "$@"
}

boot() {
        start "$@"
}

shutdown() {
        stop
}

disable() {    #禁止服务
        name="$(basename "${initscript}")"
        rm -f "$IPKG_INSTROOT"/etc/rc.d/S??$name
        rm -f "$IPKG_INSTROOT"/etc/rc.d/K??$name
}

enable() {    #开启服务
        name="$(basename "${initscript}")"
        disable
        [ -n "$START" -o -n "$STOP" ] || {
                echo "/etc/init.d/$name does not have a START or STOP value"
                return 1
        }
        [ "$START" ] && ln -s "../init.d/$name" "$IPKG_INSTROOT/etc/rc.d/S${START}${name##S[0-9][0-9]}"
        [ "$STOP"  ] && ln -s "../init.d/$name" "$IPKG_INSTROOT/etc/rc.d/K${STOP}${name##K[0-9][0-9]}"
}

enabled() {
        name="$(basename "${initscript}")"
        [ -x "$IPKG_INSTROOT/etc/rc.d/S${START}${name##S[0-9][0-9]}" ]
}

depends() {
        return 0
}

help() {
        cat <<EOF
Syntax: $initscript [command]

Available commands:
        start   Start the service
        stop    Stop the service
        restart Restart the service
        reload  Reload configuration files (or restart if that fails)
        enable  Enable service autostart
        disable Disable service autostart
$EXTRA_HELP
EOF
}

# for procd
start_service() {
        return 0
}

stop_service() {
        return 0
}

service_triggers() {
        return 0
}

service_running() {
        return 0
}

${INIT_TRACE:+set -x}

. "$initscript"    #引用脚本

[ -n "$USE_PROCD" ] && {
        EXTRA_COMMANDS="${EXTRA_COMMANDS} running trace"

        . $IPKG_INSTROOT/lib/functions/procd.sh
        basescript=$(readlink "$initscript")
        rc_procd() {
                procd_open_service "$(basename ${basescript:-$initscript})" "$initscript"
                "$@"
                procd_close_service
        }

        start() {
                rc_procd start_service "$@"
                if eval "type service_started" 2>/dev/null >/dev/null; then
                        service_started
                fi
        }

        trace() {
                TRACE_SYSCALLS=1
                start "$@"
        }

        stop() {
                stop_service "$@"
                procd_kill "$(basename ${basescript:-$initscript})" "$1"
        }

        reload() {
                if eval "type reload_service" 2>/dev/null >/dev/null; then
                        reload_service "$@"
                else
                        start
                fi
        }

        running() {
                service_running "$@"
        }
}

ALL_COMMANDS="start stop reload restart boot shutdown enable disable enabled depends ${EXTRA_COMMANDS}"    #所有命令,包括标准的,及定制的
list_contains ALL_COMMANDS "$action" || action=help
[ "$action" = "reload" ] && action='eval reload "$@" || restart "$@" && :'
$action "$@"
  • 重载初始化脚本函数

可以通过如下方式覆盖这些标准的初始化脚本函数:

{boot()},boot时支持的命令,缺省为start。

        Commands to be run at boot time.Defaults to {start()}

{restart()} 重启动服务,缺省为stop然后再start。

        Restart your service. Defaults to{stop(); start()}

{reload()} 重新载入配置文件,缺省是restart。

        Reload the configuration files for yourservice. Defaults to {restart()}

 

  • 定制脚本命令

也可定制命令,创建功能函数,在EXTRA_COMMANDS变量中引用,Helptext添加在EXTRA_HELP中。

如下:

status() {

    # print the status info

}

EXTRA_COMMANDS="status"

EXTRA_HELP="        status Print the status of the service"

在/etc/rc.common中可以看出,会包含此脚本,从而包含了其中的所有定义,从而可正确地去使用。

_____________________________________________________________________________________________

例如:

parse.sh

#!/bin/sh

. $1
start_test

test.sh

#!/bin/sh  ./parse.sh


start_test()
{
        echo "hello,world!"
}

执行: ./test.sh

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值