Linux启动脚本分析之functions.docx
《Linux启动脚本分析之functions.docx》由会员分享,可在线阅读,更多相关《Linux启动脚本分析之functions.docx(18页珍藏版)》请在冰豆网上搜索。
Linux启动脚本分析之functions
Linux启动脚本分析之functions
#-*-Shell-script-*-
#
#functions Thisfilecontainsfunctionstobeusedbymostorall #注释:
该脚本几乎被/etc/init.d/下的所有脚本所调用,因为它包含了大量的
# shellscriptsinthe/etc/init.ddirectory. #的基础函数。
同时也被/etc/rc.d/rc.sysinit,例如success、action、failure等函数
#
TEXTDOMAIN=initscripts #设置TEXTDOMAIN变量
##########################################################################################################################################################
#Makesureumaskissane #确保root用户的umask是正确的022(也就是rwxr-xr-x)
umask022
#Setupadefaultsearchpath. #设置默认的PATH变量
PATH="/sbin:
/usr/sbin:
/bin:
/usr/bin:
/usr/X11R6/bin" #默认为/sbin:
/usr/sbin:
/bin:
/usr/bin:
/usr/X11R6/bin
exportPATH #导出为环境变量
#Getasanescreenwidth #设置正确的屏幕宽度
[-z"${COLUMNS:
-}"]&&COLUMNS=80 #如果COLUMNS变量的值为空,则设置为80(列)
[-z"${CONSOLETYPE:
-}"]&&CONSOLETYPE="`/sbin/consoletype`" #如果CONSOLETYPE为空则设置CONSOLETYPE为/sbin/consoletype命令返回的值
#一般是vt或者pty、serial
##########################################################################################################################################################
if[-f/etc/sysconfig/i18n-a-z"${NOLOCALE:
-}"];then #如果存在/etc/sysconfig/i18n且 NOLOCALE 变量的值为空,则
./etc/sysconfig/i18n #执行/etc/sysconfig/i18n文件,取得LANG变量的值
if["$CONSOLETYPE"!
="pty"];then #如果当前console类型不是pty(远程登录),而是vt或者serial,则
case"${LANG:
-}"in #根据LANG的值作出选择
ja_JP*|ko_KR*|zh_CN*|zh_TW*|bn_*|bd_*|pa_*|hi_*|ta_*|gu_*) #如果LANG是 日文、中文简体、中文繁体、韩文等,则
exportLC_MESSAGES=en_US # 把LC_MESSAGES设置为en_US
exportLANG #同时导出为环境变量
;;
*)
exportLANG #如果是其他类型的语言,则直接导出LANG
; ;
esac
else #如果当前consle是pty
[-n"$LC_MESSAGES"]&&exportLC_MESSAGES #且如果LC_MESSAGES不为空,则直接导出LC_MESSAGES
exportLANG
fi
fi
##########################################################################################################################################################
#下面是设置success、failure、passed、warning4种情况下的字体颜色的
#Readinourconfiguration
if[-z"${BOOTUP:
-}"];then #首先如果BOOTUP 变量为空,则
if[-f/etc/sysconfig/init];then #如果存在/etc/sysconfig/init文件,执行/etc/sysconfig/init文件
./etc/sysconfig/init
else #否则我们就手工设置
#Thisallseemconfusing?
Lookin/etc/sysconfig/init,
#orin/usr/doc/initscripts-*/sysconfig.txt
BOOTUP=color # 第一设置BOOTUP变量,默认就是color
RES_COL=60 #第二设置设置在屏幕的第几列输出后面的"[xxx]",默认是第60列
MOVE_TO_COL="echo-en\\033[${RES_COL}G" #MOVE_TO_COL是用于打印"OK"或者"FAILED",或者"PASSED",或者 "WARNING" 之前的部分,不含"["
SETCOLOR_SUCCESS="echo-en\\033[1;32m" # SETCOLOR_SUCCESS 设置后面的字体都为绿色
SETCOLOR_FAILURE="echo-en\\033[1;31m" #SETCOLOR_FAILURE设置后面将要输出的字体都为红色
SETCOLOR_WARNING="echo-en\\033[1;33m" #SETCOLOR_WARNING设置后面将要输出的字体都为黄色
SETCOLOR_NORMAL="echo-en\\033[0;39m" # SETCOLOR_NORMAL设置后面输出的字体都为白色(默认)
LOGLEVEL=1
fi
if["$CONSOLETYPE"="serial"];then #如果是通过串口登录的,则全部取消彩色输出
BOOTUP=serial
MOVE_TO_COL=
SETCOLOR_SUCCESS=
SETCOLOR_FAILURE=
SETCOLOR_WARNING=
SETCOLOR_NORMAL=
fi
fi
##########################################################################################################################################################
if["${BOOTUP:
-}"!
="verbose"];then #如果BOOTUP变量的值不为verbose,则
INITLOG_ARGS="-q" #把INITLOG_ARGS的值设置为-q(安静模式)
else #否则
INITLOG_ARGS= #把INITLOG_ARGS的值请空
fi
##########################################################################################################################################################
#Checkif$pid(couldbeplural)arerunning #下面定义一个函数checkpid(),目的是检查/proc下是否存在指定的目录(例如/proc/1/)
checkpid(){ #如果有任意一个存在,则返回0;
locali
foriin$*;do
[-d"/proc/$i"]&&return0
done
return1 #如果给出的参数全部不存在对应的目录,则返回1
}
##########################################################################################################################################################
#Afunctiontostartaprogram. #下面定义最重要的一个函数,daemon函数,它的作用是启动某项服务。
/etc/init.d/下的脚本的start部分都会用到它
daemon(){
#Testsyntax.
localgotbase=force=
localbase=user=nice=bg=pid=
nicelevel=0
while["$1"!
="${1##[-+]}"];do #daemon函数本身可以指定多个选项,例如 --check ,--check=,
case$1in
'') echo$"$0:
Usage:
daemon[+/-nicelevel]{program}" #也可以指定nice值
return1;;
--check)
base=$2
gotbase="yes"
shift2
;;
--check=?
*)
base=${1#--check=}
gotbase="yes"
shift
;;
--user) #也可以指定要以什么用户身份运行(--user,--user=)
user=$2
shift2
;;
--user=?
*)
user=${1#--user=}
shift
;;
--force)
force="force" # --force表示强制运行
shift
;;
[-+][0-9]*)
nice="nice-n$1" #如果daemon的第一个参数是数字,则认为是nice值
shift
;;
*) echo$"$0:
Usage:
daemon[+/-nicelevel]{program}"
return1;;
esac
done
#Savebasename. # basename就是从服务器的二进制程序的fullpath中取出最后的部分
[-z"$gotbase"]&&base=${1##*/}
#Seeifit'salreadyrunning.Look*only*atthepidfile. #检查该服务是否已经在运行。
不过daemon函数只查看pid文件而已
if[-f/var/run/${base}.pid];then #如果/var/run下存在该服务的pid文件,则
locallinep
readline
注意pid文件可能有多行,且不一定都是数字
forpin$line;do # 对于line变量的每个word 进行检查
[-z"${p//[0-9]/}"-a-d"/proc/$p"]&&pid="$pid$p" #如果p全部是数字,且存在/proc/$p/目录,则认为该数字是一个pid,把它加入到pid变量
done #到最后pid变量的值可能是有多个由空格分隔的数字组成
fi
[-n"${pid:
-}"-a-z"${force:
-}"]&&return #如果pid变量最终为空,则force变量为空(不强制启动),则返回
#makesureitdoesn'tcoredumpanywhereunlessrequested #下面对该服务使用的资源作一些设置
ulimit-S-c${DAEMON_COREFILE_LIMIT:
-0}>/dev/null2>&1 #ulimit是控制由该shell启动的进程能够使用的资源,-S是softcontrol的意思,-c是指最大的core
# dump文件大小,如果DEAMON_COREFILE_LIMIT 为空,则默认为0
#iftheysetNICELEVELin/etc/sysconfig/foo,honorit #如果存在/etc/sysconfi/foo文件,且其中有NICELEVEL变量则用它代替 daemon 后面的那个nice值
[-n"$NICELEVEL"]&&nice="nice-n$NICELEVEL" #注意,这里的nice赋值是用nice-n的格式,因为nice 本身可以启动命令,用这个格式较方便
#Echodaemon #如果BOOTUP的值为verbose,则打印一个服务名
["${BOOTUP:
-}"="verbose"-a-z"$LSB"]&&echo-n"$base"
#Andstartitup. #下面是开始启动它了
if[-z"$user"];then #如果user变量为空,则默认使用root启动它
$niceinitlog$INITLOG_ARGS-c"$*" #执行nice-ninitlog-q-c"$*"
else