我们知道service命令是用于管理Linux系统中的各种服务的命令。其实service是位于系统中/usr/sbin/service的一个可执行的脚本,其内容如下:
- #!/bin/sh
- ###########################################################################
- # /usr/bin/service
- #
- # A convenient wrapper for the /etc/init.d init scripts.
- #(不过是/etc/init.d/ 目录下各种可执行脚本的一个为了方便调用而增加的一个包装而已。)
- #
- ###########################################################################
- is_ignored_file() {
- case "$1" in
- skeleton | README | *.dpkg-dist | *.dpkg-old | rc | rcS | single | reboot | bootclean.sh)
- return 0
- ;;
- esac
- return 1
- }
- VERSION="`basename $0` ver. 0.91-ubuntu1"
- USAGE="Usage: `basename $0` < option > | --status-all | \
- [ service_name [ command | --full-restart ] ]"
- SERVICE=
- ACTION=
- SERVICEDIR="/etc/init.d"
- OPTIONS=
- # 没有给出参数,打印提示信息
- if [ $# -eq 0 ]; then
- echo "${USAGE}" >&2
- exit 1
- fi
- # 改变目录
- cd /
- while [ $# -gt 0 ]; do
- case "${1}" in
- --help | -h | --h* ) # 处理 service --help / -h / --h
- echo "${USAGE}" >&2
- exit 0
- ;;
- --version | -V ) # 处理 service --version / -V
- echo "${VERSION}" >&2
- exit 0
- ;;
- *) # 处理 其它的情况
- # 没有命令名,并且参数个数为1,并且此参数为 --status-all. 也就是 "service --status-all"
- if [ -z "${SERVICE}" -a $# -eq 1 -a "${1}" = "--status-all" ]; then
- cd ${SERVICEDIR} # 进入目录/etc/init.d/
- for SERVICE in * ; do # 对目录/etc/init.d/中的每一个文件进行下面的处理
- case "${SERVICE}" in # 忽略下面一些的文件的执行
- functions | halt | killall | single| linuxconf| kudzu)
- ;;
- *) # 其它不可忽略的情况的处理
- # 文件不是可以忽略的,并且还具有可执行权限
- if ! is_ignored_file "${SERVICE}" \
- && [ -x "${SERVICEDIR}/${SERVICE}" ]; then
- if ! grep -qs "\Wstatus)" "$SERVICE"; then
- #printf " %s %-60s %s\n" "[?]" "$SERVICE:" "unknown" 1>&2
- echo " [ ? ] $SERVICE" 1>&2
- continue
- else # 获得对应命令的status
- out=$(env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" status 2>&1)
- #上面的env -i正确执行完成,并且执行的结果$out非空(true),说明对应的命令正在运行
- if [ "$?" = "0" -a -n "$out" ]; then
- #printf " %s %-60s %s\n" "[+]" "$SERVICE:" "running"
- echo " [ + ] $SERVICE"
- continue
- else # 对应的命令没有正在运行
- #printf " %s %-60s %s\n" "[-]" "$SERVICE:" "NOT running"
- echo " [ - ] $SERVICE"
- continue
- fi
- fi
- #env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" status
- fi
- ;;
- esac
- done
- exit 0
- # 如果参数的个数位2,并且第二个参数为--full-restart
- elif [ $# -eq 2 -a "${2}" = "--full-restart" ]; then
- SERVICE="${1}" # 先停止,然后开启
- if [ -x "${SERVICEDIR}/${SERVICE}" ]; then
- env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" stop
- env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" start
- exit $?
- fi
- elif [ -z "${SERVICE}" ]; then # 给在开头定义的变量赋值
- SERVICE="${1}"
- elif [ -z "${ACTION}" ]; then # 给在开头定义的变量赋值
- ACTION="${1}"
- else
- OPTIONS="${OPTIONS} ${1}" # 给在开头定义的变量赋值
- fi
- shift
- ;;
- esac
- done
- # 判断是否存在对应命令的配置文件
- if [ -r "/etc/init/${SERVICE}.conf" ]; then
- # Upstart configuration exists for this job
- case "${ACTION}" in
- start|stop|restart|status|reload)
- # Action is a valid upstart action
- exec ${ACTION} ${SERVICE} ${OPTIONS} # 根据参数执行
- ;;
- force-reload)
- # Upstart just uses reload for force-reload
- exec reload ${SERVICE} ${OPTIONS} # 根据参数执行
- ;;
- esac
- fi
# env -i 删除所以的环境变量,仅仅保留LANG PATH TERM三个环境变量,然后执行安装参数执行命令
- # Otherwise, use the traditional sysvinit
- if [ -x "${SERVICEDIR}/${SERVICE}" ]; then
- exec env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" ${ACTION} ${OPTIONS}
- else
- echo "${SERVICE}: unrecognized service" >&2
- exit 1
- fi