Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1246400
  • 博文数量: 105
  • 博客积分: 127
  • 博客等级: 入伍新兵
  • 技术积分: 962
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-29 15:22
文章分类

全部博文(105)

文章存档

2021年(1)

2019年(3)

2018年(1)

2017年(11)

2016年(47)

2015年(32)

2014年(4)

2012年(6)

我的朋友

分类: LINUX

2016-06-15 16:27:33


转载:http://www.cnblogs.com/zengjfgit/p/5116713.html

#!/bin/sh
#
# rc     This file is responsible for starting/stopping
#        services when the runlevel changes.
#
#        Optimization feature:
#        A startup script is _not_ run when the service was
#        running in the previous runlevel and it wasn't stopped # in the runlevel transition (most Debian services don't #        have K?? links in rc{1,2,3,4,5} )
#
# Author:    Miquel van Smoorenburg  #        Bruce Perens  #
# Version:    @(#)rc 2.78 07-Nov-1999 miquels@cistron.nl
#

# 一. 参考文档:
# 1. inittab脚本启动解析 
#         http://blog.chinaunix.net/uid-17188120-id-4073497.html # 2. Customizing the SDK Splash Screen
#         http://processors.wiki.ti.com/index.php/Customizing_the_SDK_Splash_Screen # 3. psplash进度条旋转成功
#         http:// #
# 2016-1-9 深圳 南山平山村 曾剑锋 

##
##
## /etc/default/rcS
##
## Default settings for the scripts in /etc/rcS.d/ ##
## For information about these variables see the rcS(5) manual page.
##
## This file belongs to the "initscripts" package.
#
## delete files in /tmp during boot older than x days.
## '0' means always, -1 or 'infinite' disables the feature
#TMPTIME=0 #
## spawn sulogin during boot, continue normal boot if not used in 30 seconds
#SULOGIN=no
#
## do not allow users to log in until the boot has completed
#DELAYLOGIN=no
#
## assume that the BIOS clock is set to UTC time (recommended)
#UTC=yes
#
## be more verbose during the boot process
#VERBOSE=no
#
## automatically repair filesystems with inconsistencies during boot
#FSCKFIX=no
. /etc/default/rcS
export VERBOSE

# 在rcS中设置的一些环境变量
# PATH=/sbin:/bin:/usr/sbin:/usr/bin
# runlevel=S
# prevlevel=N
# umask 022 # export PATH runlevel prevlevel
# 
# exec /etc/init.d/rc S

# 这个函数名可以认为是重置进度条进度
startup_progress() {
    # 当前进度大小=上一次的进度+上每次的进度的变化值
    step=$(($step + $step_change)) if [ "$num_steps" != "0" ]; then
        # 这里相当于重新计算当前step占进度条的百分比
        progress=$((($step * $progress_size / $num_steps) + $first_step)) else # 直接就是100%了
        progress=$progress_size
    fi
    #echo "PROGRESS is $progress $runlevel $first_step + ($step of $num_steps) $step_change $progress_size" #if type psplash-write >/dev/null 2>&1; then #    TMPDIR=/mnt/.psplash psplash-write "PROGRESS $progress" || true #fi
    # 将上面的progress的值写入fifo中去,echo的值是固定的。 if [ -e /mnt/.psplash/psplash_fifo ]; then
        echo "PROGRESS $progress" > /mnt/.psplash/psplash_fifo
    fi
}


#
# Start script or program.
#
# 启动脚本函数
startup() {
    # Handle verbosity 
    # VERBOSE=no, 不显示这一部分内容
    [ "$VERBOSE" = very ] && echo "INIT: Running $@..." case "$1" in *.sh)
            # Source shell script for speed.
            # 这里相当于直接执行脚本,丢弃了参数
            (
                trap - INT QUIT TSTP
                scriptname=$1 shift
                . $scriptname
            )
            ;; *)
            # 执行参数里命令 "$@" ;;
    esac
    startup_progress
}

# Ignore CTRL-C only in this shell, so we can interrupt subprocesses.
# 这里就是捕捉INT QUIT TSTP三个信号,执行“:”,实际就是忽略这三个信号,防止脚本执行时使用ctrl-C 就退出脚本
trap ":" INT QUIT TSTP

# Set onlcr to avoid staircase effect.
# 设置onlcr避免楼梯的效果。
stty onlcr 0>&1 # Now find out what the current and what the previous runlevel are.

runlevel=$RUNLEVEL
#echo "danny add" echo  $2 sleep 5 # Get first argument. Set new runlevel to this argument.
# 由于传进来的参数的$1=S,所以这里可以断定的是runlevel是S
[ "$1" != "" ] && runlevel=$1 if [ "$runlevel" = "" ]
then
    echo "Usage: $0 " >&2 exit 1 fi
# 目前没有看到由有关PREVLEVEL相关的内容,这里previous是N
previous=$PREVLEVEL
[ "$previous" = "" ] && previous=N

export runlevel previous

# Is there an rc directory for this new runlevel? if [ -d /etc/rc$runlevel.d ]
then
    # Find out where in the progress bar the initramfs got to.
    PROGRESS_STATE=0 #if [ -f /dev/.initramfs/progress_state ]; then #    . /dev/.initramfs/progress_state
    #fi

    # Split the remaining portion of the progress bar into thirds
    # 感觉这里可以认为是:已经出了一部分的脚本了,这部分内容也应该算进去
    # 所以给出一部分进度条的空间出来,这样,进度条就不像是从0开始,至少
    # 当我们看到图像的时候,psplash这个进程已经跑起来了。
    progress_size=$(((100 - $PROGRESS_STATE) / 3))

    # 这里的runlevel是S case "$runlevel" in 0|6)
            # Count down from -100 to 0 and use the entire bar
            first_step=-100 progress_size=100 step_change=1 ;;
        S)
            # Begin where the initramfs left off and use 2/3 # of the remaining space
            first_step=$PROGRESS_STATE
            progress_size=$(($progress_size * 2))  # 剩下2/3 step_change=1 ;; *)
            # Begin where rcS left off and use the final 1/3 of
            # the space (by leaving progress_size unchanged)
            first_step=$(($progress_size * 2 + $PROGRESS_STATE))
            step_change=1 ;;
    esac

    num_steps=0 for s in /etc/rc$runlevel.d/[SK]*; do case "${s##/etc/rc$runlevel.d/S??}" in gdm|xdm|kdm|reboot|halt) break ;;
        esac
        num_steps=$(($num_steps + 1))
    done
    step=0 # First, run the KILL scripts.
    # 先结束掉需要结束的进程 if [ $previous != N ]
    then for i in /etc/rc$runlevel.d/K[0-9][0-9]* do # Check if the script is there.
            [ ! -f $i ] && continue # Stop the service.
            startup $i stop
        done
    fi

    # Now run the START scripts for this runlevel. for i in /etc/rc$runlevel.d/S* do [ ! -f $i ] && continue # 这里的previous=N,可以不用关心 if [ $previous != N ] && [ $previous != S ]
        then
            #
            # Find start script in previous runlevel and
            # stop script in this runlevel.
            #
            suffix=${i#/etc/rc$runlevel.d/S[0-9][0-9]}
            stop=/etc/rc$runlevel.d/K[0-9][0-9]$suffix
            previous_start=/etc/rc$previous.d/S[0-9][0-9]$suffix
            #
            # If there is a start script in the previous level
            # and _no_ stop script in this level, we don't # have to re-start the service.
            #
            [ -f $previous_start ] && [ ! -f $stop ] && continue fi case "$runlevel" in 0|6)
                startup $i stop
                ;; *)
                startup $i start
                ;;
        esac
    done
fi

#Uncomment to cause psplash to exit manually, otherwise it exits when it sees a VC switch if [ "x$runlevel" != "xS" ] && [ ! -x /etc/init.d/xserver-nodm ]; then
    . /etc/init.d/qt.sh
# if type psplash-write >/dev/null 2>&1; then
#        TMPDIR=/mnt/.psplash psplash-write "QUIT" || true #        umount /mnt/.psplash
#    fi
fi

阅读(2868) | 评论(0) | 转发(0) |
0

上一篇:C 面试

下一篇:kernel cmdline 参数积累

给主人留下些什么吧!~~