OnWorks Linux 和 Windows 在线工作站

商标

工作站免费在线托管

<上一页 | 内容 | 下一页>

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

OnWorks 的顶级操作系统云计算: