D.2。 /lib/lsb/init 函数
#!/ bin / sh的
############################################### ######################
#
# 开始 /lib/lsb/init-functions
#
# 描述:运行级别控制功能
#
#!/ bin / sh的
############################################### ######################
#
# 开始 /lib/lsb/init-functions
#
# 描述:运行级别控制功能
#
#作者
#
# 更新
#
# 版本
#
#注意
#
#
#
#
#作者
#
# 更新
#
# 版本
#
#注意
#
#
#
#
############################################### ######################
##环境设置
# 为环境 umask 022 设置默认值
导出路径="/bin:/usr/bin:/sbin:/usr/sbin"
## 设置颜色命令,通过 echo 使用
# 更多信息请参考`man console_codes
# 在“ECMA-48 Set Graphics Rendition”部分下
#
# 警告:当从 8 位切换到 9 位字体时,
# linux 控制台会将粗体 (1;) 重新解释为
############################################### ######################
##环境设置
# 为环境 umask 022 设置默认值
导出路径="/bin:/usr/bin:/sbin:/usr/sbin"
## 设置颜色命令,通过 echo 使用
# 更多信息请参考`man console_codes
# 在“ECMA-48 Set Graphics Rendition”部分下
#
# 警告:当从 8 位切换到 9 位字体时,
# linux 控制台会将粗体 (1;) 重新解释为
# 256bit 字体的前 9 个字形。 这确实
# 不影响帧缓冲控制台
NORMAL="\\033[0;39m" # 标准控制台灰色 SUCCESS="\\033[1;32m" # 成功为绿色 WARNING="\\033[1;33m" # 警告为黄色 FAILURE="\\ 033[1;31m" # 失败为红色 INFO="\\033[1;36m" # 信息为浅青色 BRACKET="\\033[1;34m" # 括号为蓝色
# 使用彩色前缀 BMPREFIX=""
SUCCESS_PREFIX="${SUCCESS} * ${NORMAL} " FAILURE_PREFIX="${FAILURE}*****${NORMAL} " WARNING_PREFIX="${WARNING} *** ${NORMAL} " SKIP_PREFIX="${信息} S ${NORMAL}"
SUCCESS_SUFFIX="${BRACKET}[${SUCCESS} OK ${BRACKET}]${NORMAL}" FAILURE_SUFFIX="${BRACKET}[${FAILURE} FAIL ${BRACKET}]${NORMAL}" WARNING_SUFFIX="$ {BRACKET}[${WARNING} WARN ${BRACKET}]${NORMAL}" SKIP_SUFFIX="${BRACKET}[${INFO} SKIP ${BRACKET}]${NORMAL}"
BOOTLOG=/run/bootlog KILLDELAY=3 SCRIPT_STAT="0"
# 设置任何用户指定的环境变量,例如 HEADLESS [ -r /etc/sysconfig/rc.site ] && 。 /etc/sysconfig/rc.site
## 屏幕尺寸
# 查找当前屏幕大小 if [ -z "${COLUMNS}" ]; 然后
COLUMNS=$(stty 大小) COLUMNS=${COLUMNS##* }
fi
# 使用远程连接时,例如串口,stty size 返回0 if [ "${COLUMNS}" = "0" ]; 然后
列数=80
fi
## 测量定位结果消息 COL=$((${COLUMNS} - 8))
WCOL=$((${COL} - 2))
## 设置光标位置命令,通过 echo SET_COL="\\033[${COL}G" # at the $COL char SET_WCOL="\\033[${WCOL}G" # at the $WCOL char CURS_UP= "\\033[1A\\033[0G" # 向上一行,在第 0 个字符处 CURS_ZERO="\\033[0G"
############################################### #############################
# 启动守护进程() #
# 用法:start_daemon [-f] [-n nicelevel] [-p pidfile] pathname [args...] #
###
# 目的:将指定的程序作为守护进程运行 #
###
# Inputs: -f: (force) 运行程序,即使它已经在运行。 #
# -n nicelevel:指定一个好的级别。 参见“好人(1)”。 #
# -p pidfile: 使用指定的文件来确定 PID。 #
# pathname:指定程序的完整路径#
# args:传递给程序的附加参数(路径名)#
###
# 返回值(由 LSB 退出代码定义):#
# 0 - 程序正在运行或服务正常 #
# 1 - 通用或未指定的错误 #
# 2 - 无效或过多的参数#
# 5 - 程序未安装#
############################################### #############################
启动守护进程()
{
本地强制=""本地好="0"本地pidfile=""本地pidlist=""本地retval=""
# 处理参数,而为真
do
案例“${1}”在
-F)
force="1" 移 1
;;
-n)
nice="${2}" 移 2
;;
-p)
pidfile="${2}" 移位 2
;;
-*)
返回2
;;
完成
*)
ESAC
program="${1}" 中断
;;
# 检查一个有效的程序
如果 [ ! -e "${program}" ]; 然后返回5; 菲
# 执行
如果 [ -z "${force}" ]; 然后
如果 [ -z "${pidfile}" ]; 然后
# 通过发现确定pid pidlist=`pidofproc "${1}"` retval="${?}"
其他
# PID 文件包含所需的 PID
# 注意LSB要求,路径必须给pidofproc,
# 但是,当前的实现或标准不使用它。 pidlist=`pidofproc -p "${pidfile}" "${1}"`
retval="${?}"
fi
# 只返回一个值
# 这是初始化脚本(或发行版的功能)的职责
# 记录消息! 案例“${retval}”在
0)
# 程序已经正常运行,这是一个
# 成功启动。 返回 0
;;
1)
# 程序没有运行,但存在无效的pid文件
# 删除pid文件并继续 rm -f "${pidfile}"
;;
3)
# 程序未运行且不存在pidfile
# 这里什么都不做,让 start_deamon 继续。
;;
*)
ESAC
fi
# 其他由状态值返回的值不应被解释
# 并作为未指定的错误返回。 返回 1
;;
#开始吧!
nice -n "${nice}" "${@}"
}
############################################### #############################
#killproc()#
# 用法:killproc [-p pidfile] pathname [signal] #
###
# 目的:向正在运行的进程发送控制信号 #
###
# 输入:-p pidfile,使用指定的pidfile #
# 路径名,指定程序的路径名#
# 信号,将此信号发送到路径名 #
###
# 返回值(由 LSB 退出代码定义):#
# 0 - 程序(路径名)已停止/已停止或 #
# | 运行程序已发送指定 | 信号和 | 停止 | # | |
# | 顺利 | # | |||
# | 1 | - 一般或未指明的错误 | # | ||
# | 2 | - 无效或过多的论据 | # | ||
# | 5 | - 程序未安装 | # | ||
# | 7 | - 程序没有运行并且有信号 | 提供 | # |
############################################### #############################
杀死过程()
{
本地pidfile 本地程序本地前缀本地程序名
本地信号="-TERM" 本地回退="-KILL" 本地 nosig
本地pidlist 本地retval 本地pid
本地延迟=“30”本地piddead本地dtime
# 处理参数,而为真; 做
案例“${1}”在
-p)
pidfile="${2}" 移位 2
;;
*)
程序="${1}"
如果 [-n "${2}" ]; 然后信号="${2}" 回退=""
其他
诺西格=1
fi
# 附加参数错误 if [ -n "${3}" ]; 然后
返回2
其他
打破
完成
fi
;;
ESAC
# 检查一个有效的程序
如果 [ ! -e "${program}" ]; 然后返回5; 菲
# 检查有效信号 check_signal "${signal}"
if [ "${?}" -ne "0" ]; 然后返回2; 菲
# 获取pid列表
如果 [ -z "${pidfile}" ]; 然后
# 通过发现确定pid pidlist=`pidofproc "${1}"` retval="${?}"
其他
# PID 文件包含所需的 PID
# 注意LSB要求,路径必须给pidofproc,
# 但是,当前的实现或标准不使用它。 pidlist=`pidofproc -p "${pidfile}" "${1}"`
retval="${?}"
fi
# 只返回一个值
# 这是初始化脚本(或发行版的功能)的职责
# 记录消息! 案例“${retval}”在
0)
# 程序运行正常
# 这里什么都不做,让killproc继续。
;;
1)
# 程序没有运行,但存在无效的pid文件
# 删除pid文件。 rm -f "${pidfile}"
# 这只有在没有信号传递时才成功。 如果 [ -n "${nosig}" ]; 然后
返回0
其他
返回7
fi
;;
3)
# 程序未运行且不存在pidfile
# 这只有在没有信号传递时才成功。 如果 [ -n "${nosig}" ]; 然后
返回0
其他
返回7
fi
;;
*)
ESAC
# 其他由状态值返回的值不应被解释
# 并作为未指定的错误返回。 返回 1
;;
# 对退出信号和控制信号执行不同的动作 check_sig_type "${signal}"
如果 [ "${?}" -eq "0" ]; then # 信号用于终止程序
# 空pidlist的帐户(pid文件仍然存在并且没有
# 信号已给出)
if [ "${pidlist}" != "" ]; 然后
# 杀死${pidlist} 中pid 的pid 列表; 做
kill -0 "${pid}" 2> /dev/null if [ "${?}" -ne "0" ]; 然后
# 进程已死,继续下一步并假设一切正常继续
其他
杀死 "${signal}" "${pid}" 2> /dev/null
# 等待 ${delay}/10 秒让 "${pid}" 到
# 在十分之一秒内终止
while [ "${delay}" -ne "0" ]; 做
kill -0 "${pid}" 2> /dev/null || piddead="1" if [ "${piddead}" = "1" ]; 然后打破; fi 睡眠 0.1
延迟="$(( ${delay} - 1 ))"
完成
# 如果设置了回退,并且程序仍在运行,则
# 使用回退
if [-n "${fallback}" -a "${piddead}" != "1" ]; 然后杀死 "${fallback}" "${pid}" 2> /dev/null
睡1
# 再次检查,如果仍在运行则失败 kill -0 "${pid}" 2> /dev/null && return 1
fi
fi
完成
fi
# 检查并删除陈旧的 PID 文件。 如果 [ -z "${pidfile}" ]; 然后
# 找到 $program 的基名
prefix=`echo "${program}" | sed 's/[^/]*$//'` progname=`echo "${program}" | sed "s@${prefix}@@"`
if [ -e "/var/run/${progname}.pid" ]; 然后
rm -f "/var/run/${progname}.pid" 2> /dev/null
fi
其他
如果 [ -e "${pidfile}" ]; 然后 rm -f "${pidfile}" 2> /dev/null; 菲
fi
# 对于不希望程序退出的信号,只需
# 让 kill 完成它的工作,并评估 kill 的价值回报
else# check_sig_type - 信号不用于终止 ${pidlist} 中的 pid 程序; 做
杀死“${signal}”“${pid}”
if [ "${?}" -ne "0" ]; 然后返回1; 菲
完成
fi
}
############################################### #############################
#pidofproc()#
# 用法:pidofproc [-p pidfile] 路径名 #
###
# 目的:此函数返回一个或多个特定守护进程的 pid #
###
# 输入:-p pidfile,使用指定的pidfile代替pidof #
# pathname,指定程序的路径#
###
# 返回值(由 LSB 状态代码定义):#
# 0 - 成功(PID 到标准输出)#
# 1 - 程序已死,PID 文件仍然存在(剩余的 PID 输出)#
# 3 - 程序没有运行(没有输出)#
############################################### #############################
pidofproc()
{
本地pidfile 本地程序本地前缀本地程序名本地pidlist 本地lpids
本地退出状态=“0”
# 处理参数,而为真; 做
案例“${1}”在
-p)
pidfile="${2}" 移位 2
;;
*)
程序="${1}"
如果 [ -n "${2}" ]; 然后
# 争论太多
# 由于这是状态,返回未知返回4
其他
打破
完成
fi
;;
ESAC
# 如果没有指定 PID 文件,请尝试找到一个。 如果 [ -z "${pidfile}" ]; 然后
# 获取程序的基本名称
prefix=`echo "${program}" | sed 's/[^/]*$//'` if [ -z "${prefix}" ]; 然后
progname="${program}" 其他
progname=`echo "${program}" | sed "s@${prefix}@@"`
fi
# 如果存在具有该名称的 PID 文件,则假定就是它。 if [ -e "/var/run/${progname}.pid" ]; 然后
pidfile="/var/run/${progname}.pid"
fi
fi
# 如果设置并存在PID文件,则使用它。
if [ -n "${pidfile}" -a -e "${pidfile}" ]; 然后
# 使用pidfile第一行的值pidlist=`/bin/head -n1 "${pidfile}"`
# 这可以选择性地写为 'sed 1q' 来替换 'head -n1'
# LFS 应该将 /bin/head 移动到 /usr/bin/head
其他
# 使用 pidof
pidlist=`pidof "${program}"`
fi
# 确定所有列出的 PID 是否都在运行。 对于 ${pidlist} 中的 pid; 做
kill -0 ${pid} 2> /dev/null
如果 ["${?}" -eq "0" ]; 然后 lpids="${lpids}${pid} "
其他
退出状态=“1”
fi
完成
如果 [-z "${lpids}" -a ! -f "${pidfile}" ]; 然后返回 3
其他
回声“${lpids}”
返回“${exitstatus}”
fi
}
############################################### #############################
#状态过程()#
# 用法:statusproc [-p pidfile] 路径名 #
###
# 目的:该函数将特定守护进程的状态打印到 stdout #
###
# 输入:-p pidfile,使用指定的pidfile代替pidof #
# pathname,指定程序的路径#
###
# 返回值:#
# 0 - 打印状态#
# 1 - 输入错误。 未指定要检查的守护程序。 #
############################################### #############################
状态过程()
{
本地pidfile 本地pidlist
if [ "${#}" = "0" ]; 然后
echo "用法:statusproc [-p pidfle] {program}" exit 1
fi
# 处理参数,而为真; 做
案例“${1}”在
-p)
pidfile="${2}" 移位 2
;;
*)
如果 [ -n "${2}" ]; 然后
echo "参数过多" return 1
其他
打破
完成
fi
;;
ESAC
如果 [ -n "${pidfile}" ]; 然后 pidlist=`pidofproc -p "${pidfile}" $@`
其他
pidlist=`pidofproc $@`
fi
# 修剪尾随空白
pidlist=`echo "${pidlist}" | sed -r 's/ +$//'` base="${1##*/}"
如果 [ -n "${pidlist}" ]; 然后
/bin/echo -e "${INFO}${base} 正在运行 Process" \ "ID(s) ${pidlist}.${NORMAL}"
其他
if [ -n "${base}" -a -e "/var/run/${base}.pid" ]; 然后
/bin/echo -e "${WARNING}${1} 没有运行但是" \ "/var/run/${base}.pid 存在。${NORMAL}"
其他
if [ -n "${pidfile}" -a -e "${pidfile}" ]; 然后
/bin/echo -e "${WARNING}${1} 没有运行" \ "但是 ${pidfile} 存在。${NORMAL}"
其他
/bin/echo -e "${INFO}${1} 没有运行。${NORMAL}"
fi
fi
fi
}
############################################### #############################
#时间规格()#
###
# 目的:用于格式化时间戳的内部实用函数 #
# 启动日志文件。 设置 STAMP 变量。 #
###
# 返回值:未使用 #
############################################### #############################
时间规格()
{
STAMP="$(echo `date +"%b %d %T %:z"` `hostname`) " return 0
}
############################################### #############################
# log_success_msg() #
# 用法:log_success_msg ["message"] #
###
# 目的:在屏幕上打印一条成功的状态信息,#
# 启动日志文件。 #
###
# 输入:$@ - 消息 #
###
# 返回值:未使用 #
############################################### #############################
log_success_msg()
{
/bin/echo -n -e "${BMPREFIX}${@}"
/bin/echo -e "${CURS_ZERO}${SUCCESS_PREFIX}${SET_COL}${SUCCESS_SUFFIX}"
# 从日志文件中去除不可打印的字符 logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'`
时间规格
/bin/echo -e "${STAMP} ${logmessage} OK" >> ${BOOTLOG}
返回0
}
log_success_msg2()
{
/bin/echo -n -e "${BMPREFIX}${@}"
/bin/echo -e "${CURS_ZERO}${SUCCESS_PREFIX}${SET_COL}${SUCCESS_SUFFIX}" echo " OK" >> ${BOOTLOG}
返回0
}
############################################### #############################
# log_failure_msg() #
# 用法:log_failure_msg ["message"] #
###
# 目的:将故障状态消息打印到屏幕上并#
# 启动日志文件。 #
###
# 输入:$@ - 消息 #
###
# 返回值:未使用 #
############################################### #############################
log_failure_msg()
{
/bin/echo -n -e "${BMPREFIX}${@}"
/bin/echo -e "${CURS_ZERO}${FAILURE_PREFIX}${SET_COL}${FAILURE_SUFFIX}"
# 从日志文件 timespec 中去除不可打印的字符
logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'`
/bin/echo -e "${STAMP} ${logmessage} 失败" >> ${BOOTLOG}
返回0
}
log_failure_msg2()
{
/bin/echo -n -e "${BMPREFIX}${@}"
/bin/echo -e "${CURS_ZERO}${FAILURE_PREFIX}${SET_COL}${FAILURE_SUFFIX}" echo "FAIL" >> ${BOOTLOG}
返回0
}
############################################### #############################
# log_warning_msg() #
# 用法:log_warning_msg ["message"] #
###
# 目的:在屏幕上打印警告状态消息和 #
# 启动日志文件。 #
###
# 返回值:未使用 #
############################################### #############################
log_warning_msg()
{
/bin/echo -n -e "${BMPREFIX}${@}"
/bin/echo -e "${CURS_ZERO}${WARNING_PREFIX}${SET_COL}${WARNING_SUFFIX}"
# 从日志文件中去除不可打印的字符 logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'` 时间规格
/bin/echo -e "${STAMP} ${logmessage} WARN" >> ${BOOTLOG}
返回0
}
log_skip_msg()
{
/bin/echo -n -e "${BMPREFIX}${@}"
/bin/echo -e "${CURS_ZERO}${SKIP_PREFIX}${SET_COL}${SKIP_SUFFIX}"
# 从日志文件中去除不可打印的字符 logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'`
/bin/echo "跳过" >> ${BOOTLOG}
返回0
}
############################################### #############################
# log_info_msg() #
# 用法:log_info_msg 消息 #
###
# 目的:在屏幕上打印一条信息消息并#
# 启动日志文件。 不打印尾随换行符。 #
###
# 返回值:未使用 #
############################################### #############################
log_info_msg()
{
/bin/echo -n -e "${BMPREFIX}${@}"
# 从日志文件中去除不可打印的字符 logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'` 时间规格
/bin/echo -n -e "${STAMP} ${logmessage}" >> ${BOOTLOG}
返回0
}
log_info_msg2()
{
/bin/echo -n -e "${@}"
# 从日志文件中去除不可打印的字符 logmessage=`echo "${@}" | sed 's/\\\033[^a-zA-Z]*.//g'`
/bin/echo -n -e "${logmessage}" >> ${BOOTLOG}
返回0
}
############################################### #############################
#evaluate_retval() #
# 用法:评估返回值并根据需要打印成功或失败 #
###
# 目的:终止信息消息的便利功能#
###
# 返回值:未使用 #
############################################### #############################
评估_retval()
{
本地 error_value="${?}"
如果 [ ${error_value} = 0 ]; 然后 log_success_msg2
其他
日志失败消息2
fi
}
############################################### #############################
#检查信号()#
# 用法:check_signal [ -{signal} | {信号} ] #
###
# 目的:检查有效信号。 这不是由任何 LSB 草案定义的,#
# 但是,需要检查信号以确定是否 #
# 选择的信号是其他函数的无效参数。 #
###
# 输入:接受形式为或 -{signal} 或 {signal} 的单个字符串值 #
###
# 返回值:#
# 0 - 成功(信号有效#
# 1 - 信号无效#
############################################### #############################
检查信号()
{
本地valsig
# 为无效信号添加错误处理
valsig="-ALRM -HUP -INT -KILL -PIPE -POLL -PROF -TERM -USR1 -USR2" valsig="${valsig} -VTALRM -STKFLT -PWR -WINCH -CHLD -URG -TSTP -TTIN" valsig= "${valsig} -TTOU -STOP -CONT -ABRT -FPE -ILL -QUIT -SEGV -TRAP" valsig="${valsig} -SYS -EMT -BUS -XCPU -XFSZ -0 -1 -2 -3 - 4 -5 -6 -8 -9"
valsig="${valsig} -11 -13 -14 -15"
echo "${valsig}" | grep -- " ${1} " > /dev/null if [ "${?}" -eq "0" ]; 然后
返回0
其他
返回1
fi
}
############################################### #############################
# check_sig_type() #
# 用法:check_signal [ -{signal} | {信号} ] #
###
# 目的:检查信号是程序终止信号还是控制信号#
# 这在任何 LSB 草案中都没有定义,但是,它需要 #
# 检查信号以确定它们是否打算结束 #
# 程序或简单地控制它。 #
###
# 输入:接受形式为或 -{signal} 或 {signal} 的单个字符串值 #
###
# 返回值:#
# 0 - 信号用于程序终止#
# 1 - 信号用于程序控制#
############################################### #############################
check_sig_type()
{
本地valsig
# 终止信号列表(限于常用项) valsig="-ALRM -INT -KILL -TERM -PWR -STOP -ABRT -QUIT -2 -3 -6 -9 -14 -15"
echo "${valsig}" | grep -- " ${1} " > /dev/null if [ "${?}" -eq "0" ]; 然后
返回0
其他
返回1
fi
}
############################################### #############################
# wait_for_user() #
###
# 目的:如果不是无头系统,则等待用户响应 #
###
############################################### #############################
等待用户()
{
# 默认等待用户
[ "${HEADLESS=0}" = "0" ] && 读回车
返回0
}
############################################### #############################
# 是真的() #
###
# 目的:测试变量是否为真的实用程序 | 是 | 1#
###
############################################### #############################
是真的()
{
[ "$1" = "1" ] || [ "$1" = "是"] || [ "$1" = "真" ] || [ "$1" = "y" ] || [ "$1" = "t" ]
}
# 结束 /lib/lsb/init-functions
返回0
其他
返回1
fi
}
############################################### #############################
# wait_for_user() #
###
# 目的:如果不是无头系统,则等待用户响应 #
###
############################################### #############################
等待用户()
{
# 默认等待用户
[ "${HEADLESS=0}" = "0" ] && 读回车
返回0
}
############################################### #############################
# 是真的() #
###
# 目的:测试变量是否为真的实用程序 | 是 | 1#
###
############################################### #############################
是真的()
{
[ "$1" = "1" ] || [ "$1" = "是"] || [ "$1" = "真" ] || [ "$1" = "y" ] || [ "$1" = "t" ]
}
# 结束 /lib/lsb/init-functions
:杰拉德·比克曼斯 - [电子邮件保护] DJ 卢卡斯 - [电子邮件保护]
:布鲁斯·杜布斯 - [电子邮件保护]
:杰拉德·比克曼斯 - [电子邮件保护] DJ 卢卡斯 - [电子邮件保护]
:布鲁斯·杜布斯 - [电子邮件保护]
:LFS 7.0
:LFS 7.0
挂载虚拟机
挂载虚拟机
S
S