用於管理Linux系統中的各類服務的命令service命令

咱們知道service命令是用於管理Linux系統中的各類服務的命令。其實service是位於系統中/usr/sbin/service的一個可執行的腳本,其內容以下:linux

  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\n" "[?]" "$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\n" "[+]" "$SERVICE:" "running"
  63.                             echo " [ + ] $SERVICE"
  64.                             continue
  65.                           else # 對應的命令沒有正在運行
  66.                             #printf " %s %-60s %s\n" "[-]" "$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三個環境變量,而後執行安裝參數執行命令ubuntu

  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
相關文章
相關標籤/搜索