• 用于管理Linux系统中的各种服务的命令service命令


    我们知道service命令是用于管理Linux系统中的各种服务的命令。其实service是位于系统中/usr/sbin/service的一个可执行的脚本,其内容如下:

    1. #!/bin/sh
    2. ###########################################################################
    3. # /usr/bin/service
    4. #
    5. # A convenient wrapper for the /etc/init.d init scripts. 
    6. #(不过是/etc/init.d/ 目录下各种可执行脚本的一个为了方便调用而增加的一个包装而已。)
    7. #
    8. ###########################################################################
    9. is_ignored_file() {
    10.         case "$1" in
    11.                 skeleton | README | *.dpkg-dist | *.dpkg-old | rc | rcS | single | reboot | bootclean.sh)
    12.                         return 0
    13.                 ;;
    14.         esac
    15.         return 1
    16. }
    17.  
    18. VERSION="`basename $0` ver. 0.91-ubuntu1"
    19. USAGE="Usage: `basename $0` < option > | --status-all |
    20. [ service_name [ command | --full-restart ] ]"
    21. SERVICE=
    22. ACTION=
    23. SERVICEDIR="/etc/init.d"
    24. OPTIONS=
    25. # 没有给出参数,打印提示信息
    26. if [ $# -eq 0 ]; then
    27.    echo "${USAGE}" >&2
    28.    exit 1
    29. fi
    30. # 改变目录
    31. cd /
    32. while [ $# -gt 0 ]; do
    33.   case "${1}" in           
    34.     --help | -h | --h* )     # 处理 service --help / -h / --h
    35.        echo "${USAGE}" >&2
    36.        exit 0
    37.        ;;
    38.     --version | -V )         # 处理 service --version / -V 
    39.        echo "${VERSION}" >&2
    40.        exit 0
    41.        ;;
    42.     *)                       # 处理 其它的情况
    43.        # 没有命令名,并且参数个数为1,并且此参数为 --status-all. 也就是 "service --status-all"
    44.        if [ -z "${SERVICE}" -a $# -eq 1 -a "${1}" = "--status-all" ]; then
    45.           cd ${SERVICEDIR}          # 进入目录/etc/init.d/
    46.           for SERVICE in * ; do     # 对目录/etc/init.d/中的每一个文件进行下面的处理 
    47.             case "${SERVICE}" in    # 忽略下面一些的文件的执行
    48.               functions | halt | killall | single| linuxconf| kudzu)
    49.                   ;;
    50.               *)  # 其它不可忽略的情况的处理
    51.                   # 文件不是可以忽略的,并且还具有可执行权限
    52.                 if ! is_ignored_file "${SERVICE}"
    53.                     && [ -x "${SERVICEDIR}/${SERVICE}" ]; then
    54.                         if ! grep -qs "Wstatus)" "$SERVICE"; then
    55.                           #printf " %s %-60s %s " "[?]" "$SERVICE:" "unknown" 1>&2
    56.                           echo " [ ? ] $SERVICE" 1>&2
    57.                           continue
    58.                         else    # 获得对应命令的status
    59.                           out=$(env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" status 2>&1)    
    60.                         #上面的env -i正确执行完成,并且执行的结果$out非空(true),说明对应的命令正在运行
    61.                           if [ "$?" = "0" -a -n "$out" ]; then
    62.                             #printf " %s %-60s %s " "[+]" "$SERVICE:" "running"
    63.                             echo " [ + ] $SERVICE"
    64.                             continue
    65.                           else # 对应的命令没有正在运行
    66.                             #printf " %s %-60s %s " "[-]" "$SERVICE:" "NOT running"
    67.                             echo " [ - ] $SERVICE"
    68.                             continue
    69.                           fi
    70.                         fi
    71.                   #env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" status
    72.                 fi
    73.                 ;;
    74.             esac
    75.           done
    76.           exit 0
    77.        # 如果参数的个数位2,并且第二个参数为--full-restart
    78.        elif [ $# -eq 2 -a "${2}" = "--full-restart" ]; then
    79.           SERVICE="${1}"   # 先停止,然后开启
    80.           if [ -x "${SERVICEDIR}/${SERVICE}" ]; then
    81.             env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" stop
    82.             env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" start
    83.             exit $?
    84.           fi
    85.        elif [ -z "${SERVICE}" ]; then    # 给在开头定义的变量赋值
    86.          SERVICE="${1}"
    87.        elif [ -z "${ACTION}" ]; then     # 给在开头定义的变量赋值
    88.          ACTION="${1}"
    89.        else
    90.          OPTIONS="${OPTIONS} ${1}"       # 给在开头定义的变量赋值
    91.        fi
    92.        shift
    93.        ;;
    94.    esac
    95. done
    96.  
    97. # 判断是否存在对应命令的配置文件
    98. if [ -r "/etc/init/${SERVICE}.conf" ]; then
    99.    # Upstart configuration exists for this job
    100.    case "${ACTION}" in
    101.       start|stop|restart|status|reload)
    102.          # Action is a valid upstart action
    103.          exec ${ACTION} ${SERVICE} ${OPTIONS}    # 根据参数执行
    104.       ;;
    105.       force-reload)
    106.          # Upstart just uses reload for force-reload
    107.          exec reload ${SERVICE} ${OPTIONS}       # 根据参数执行
    108.       ;;
    109.    esac
    110. fi
    111.  

     # env -i 删除所以的环境变量,仅仅保留LANG PATH TERM三个环境变量,然后执行安装参数执行命令

    1. # Otherwise, use the traditional sysvinit
    2. if [ -x "${SERVICEDIR}/${SERVICE}" ]; then
    3.    exec env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" ${ACTION} ${OPTIONS}
    4. else
    5.    echo "${SERVICE}: unrecognized service" >&2
    6.    exit 1
    7. fi
  • 相关阅读:
    利用ItextPdf、core-renderer-R8 来生成PDF
    把war包放到Tomcat安装文件夹下,不能直接訪问的解决方式
    我的RTOS 之六 -- Touch移植(s5pv210+threadx+ucgui+touch)
    数据库可用率监控工具
    9款极具创意的HTML5/CSS3进度条动画(免积分下载)
    ODBC与JDBC比較
    ORA-02287: 此处不同意序号
    mongodb创建、更新、删除
    jcenter那些事儿
    C#里的应用程序域AppDomain
  • 原文地址:https://www.cnblogs.com/w-20150101/p/4377553.html
Copyright © 2020-2023  润新知