#!/bin/sh
#建立默认搜索路径
PATH="/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin"
export PATH
#定义变量,变量包括有关service 程序的版本信息、使用方法、以及程序所在的
#basename命令去除$0所代表的文件名的目录部分和后缀名,只显示基本文件名
VERSION="`basename $0` ver. 0.91"
USAGE="Usage:`basename $0`<option>| --status-all|/
[ service_name [ command|--full-restart ] ]"
SERVICE=
SERVICEDIR="/etc/init.d"
OPTIONS=
# $#表示命令参数的个数,如果只输入service,表示没有参数即$#为0
# 如果参数为0则条件成立,则执行本if语句并退出程序
# 2为标准错误流也是接到仿真终端的屏幕,所以屏幕上会显示USAGE中内容。
if [ $# -eq 0 ]; then
echo $"${USAGE}" >&2
exit 1
fi
cd /
#如果参数个数大于零,表示循环条件成立
while [ $# -gt 0 ]
do
#case表示多条件选择
#$1表示命令service的第一个参数
case "${1}" in
#如果service --help则此条件成立
--help | -h | --h* )
echo $"${USAGE}">&2
exit 0
;;
#如果service --version则此条件成立
--version | -V )
echo $"${USAGE}">&2
exit 0
;;
#如果其他情况则此条件成立
*)
#-z表示SERVICE变量为空 -a是逻辑与
#参数等于1 并且 命令后的参数是 --status-all
#表示条件成立
if [ -z "${SERVICE}" -a $# -eq 1 -a "${1}" = "--status-all" ]
then
#切换到 /etc/init.d
cd ${SERVICEDIR}
# *表示/etc/init.d下的所有文件名列表,
#所以/etc/init.d下有多少文件,就循环多少次
#显示/etc/init.d下除没有状态参数的命令文件外的其他命令文件status
for SERVICE in *
do
case "${SERVICE}" in
#如果是SERVICE是function等,因为这些程序师没有status(状态)的。
function | halt | killall | single | linuxconf |/ kudzu|*rpmorig|*rpmnew|*rpmsave|*~|*.org)
;;
#其他则可以,显示状态.比如SERVICE可以是httpd
*)
#-x表示 检查/etc/init.d/httpd是否可执行
if [ -x "${SERVICEDIR}/${SERVICE}" ]
then
#如果SERVICE是httpd,下面的应该是/etc/init.d/httpd status
env -i LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" status
fi
;;
esac
done
exit0
#service有两个参数,且第2个参数是--full-restart。
elif [ $# -eq 2 -a "${2}" == "--full-restart" ]
then
#SERVICE来自命令行的参数,比如SERVICE httpd --full-restart
#$1表示httpd
SERVICE="${1}"
if [ -x "${SERVICEDIR}/${SERVICE}" ]
then
#所以SERVICE所代表的服务停止
env -i LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" stop
#所以SERVICE所代表的服务启动
env -i LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" start
#$?表示启动服务后命令的执行状态。一般$?为1表示命令执行失败
#$?为0表示命令执行成功
exit $?
fi
#如果不满足上面的条件,即不是只有一个参数,也不是又两个参数;比如:
#即不属于service --status-all 或者也不属于service httpd --full-restart情况
#比如输入的是service httpd restart
#第一次while循环 -z 条件成立
elif [ -z "${SERVICE}" ]
then
#在第一次while循环的情况下 SERVICE为httpd
SERVICE="${1}"
#如果输入的是service httpd restart 则在第二次while循环时,OPTIONS则会获得restart
else
OPTIONS="${OPTIONS}${1}"
fi
#shift 位置参数往前平移1个位置,也就是说$2的值会传给$1.$3的值传递$1.
#OPTIONS得到了$2的值,也就是OPTIONS为restart
shift
;;
esac
done
#按照前面的思路SERVICE为httpd,-x 表示检测/etc/init.d/httpd是否可执行
if [ -x "${SERVICEDIR}/${SERVICE}" ]
then
#依据前面举得例子,shift使得OPTIONS平移,则会执行/etc/init.d/httpd restart
env -i LANG=$LANG PATH=$PATH TERM=$TERM "${SERVICEDIR}/${SERVICE}" ${OPTIONS}
#如果条件不成立,比如service ht restart,以为/etc/init.d没有ht程序
else
echo $"${SERVICE}:unrecognized service" >&2
exit 1
fi