全部博文(105)
分类: LINUX
2016-06-15 16:27:33
#!/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