linux的functions之daemon函數詳解

# 該函數的做用是啓動一個可執行的二進制程序:ios

# 使用方法:web

一、daemon {--check program|--check=program} [--user username|--user=username] [--pidfile pidfile|--pidfile=pidfile] [+/- nice]shell

二、daemon [--user username|--user=username] [--pidfile pidfile|--pidfile=pidfile] [+/- nice] {program} [program options]bash

說明:less

    調用該函數時:ide

    方法1:能夠使用--check 來指定可運行二進制程序;函數

    方法2:還能夠在以破折號開頭的參數後直接跟二進制程序.spa

     可是,若是二進制程序運行時必定要帶一些參數的話,最好使用方法2.orm

注意:blog

    若是調用函數 daemon 啓動一個二進制可執行程序時。沒有指定pidfile文件所在的位置。有可能會形成程序的再次啓動。由於,函數默認是到/var/run/目錄下找一個進程的進程號的。若是找不到就再次啓動二進制程序。

# A function to start a program.
daemon() {
        # Test syntax.
        local gotbase= force= nicelevel corelimit  
        # 設置局部變量,用來保存調用該函數傳遞過來的參數
        local pid base= user= nice= bg= pid_file=
        nicelevel=0        while [ "$1" != "${1##[-+]}" ]; do

    該循環條件做用是:找出哪一個參數是可執行程序。循環到可執行程序參數就結束while循環。由於其它參數前面都有破折號標誌(--),符合while循環條件。如:---user 或 --pidfile。因此調用該函數時:若是指定了運行該二進制程序的用戶是誰--user 或 運行程序的pid文件# 等這些選項參數,調用該函數時,必定要把這些參數放在二進制可運行程序參數前。因爲可運行程序這個參數沒有破折號標識,當while循環到該參數時,就結束循環。這帶來一個好處:有些二進制可運行程序運行時要帶選項才能運行。就能夠在二進制可運行程序後面添加二進制執行程序的選項。如:想運行nrpe這服務: 要指定配置文件和是以超級守護進程方式仍是獨立守護進程方式。

daemon --pidfie=/var/run/nrped.pid /usr/local/nagios/bin/nrpe -c /etc/nagios/nrpe.conf -d

    選項通常要使用破折號標明。

    case $1 in

    下面的case是檢測二進制執行程序前的其它參數的。把符合條件的參數使用前面定義的變量記錄下來

            '')    echo $"$0: Usage: daemon [+/-nicelevel] {program}"
                   return 1;;
            --check)
                   base=$2
                   gotbase="yes"
                   shift 2                   ;;
            --check=?*)
                   base=${1#--check=}
                   gotbase="yes"
                   shift
                   ;;
            --user)
                   user=$2
                   shift 2                   ;;
            --user=?*)
                   user=${1#--user=}
                   shift
                   ;;
            --pidfile)
                   pid_file=$2
                   shift 2                   ;;
            --pidfile=?*)
                   pid_file=${1#--pidfile=}
                   shift
                   ;;
            --force)
                   force="force"
                   shift
                   ;;
            [-+][0-9]*)
                   nice="nice -n $1"
                   shift
                   ;;
            *)     echo $"$0: Usage: daemon [+/-nicelevel] {program}"
                   return 1;;
          esac        done
       #####################################################################
        # Save basename.
        [ -z "$gotbase" ] && base=${1##*/} 
        # 若是沒有使用--check來指定二進制執行程序就執行 && 後面的參數替換。找出二進制執行# 程序並保存在變量裏。                            
        # See if it's already running. Look *only* at the pid file.
        __pids_var_run "$base" "$pid_file"  # 判斷該二進制程序是否運行的。
        [ -n "$pid" -a -z "$force" ] && return 
        # 若是找到進程的進程號, 直接返回。就不往下執行了。
        # make sure it doesn't core dump anywhere unless requested           # 資源限定
        corelimit="ulimit -S -c ${DAEMON_COREFILE_LIMIT:-0}"
        # if they set NICELEVEL in /etc/sysconfig/foo, honor it
        [ -n "${NICELEVEL:-}" ] && nice="nice -n $NICELEVEL"
        # Echo daemon     
        [ "${BOOTUP:-}" = "verbose" -a -z "${LSB:-}" ] && echo -n " $base"
        # And start it up. # 若是bash shell 執行到這,就啓動二進制程序。
        if [ -z "$user" ]; then   
           $nice /bin/bash -c "$corelimit >/dev/null 2>&1 ; $*"  
           # 啓動該二進制程序
        else
           $nice runuser -s /bin/bash - $user -c "$corelimit >/dev/null 2>&1 ; $*"         
           #若是調用該函數時指定了--user就使用該方式啓動啓                                                                               
        fi
        [ "$?" -eq 0 ] && success $"$base startup" || failure $"$base startup" 
        #根據 if 語句的執行結果$?來判斷啓動二進制程序是否成功
       #啓動成功就調用函數:success 反之則調用函數:failure}


https://blog.51cto.com/9528du/1420058

相關文章
相關標籤/搜索