# 該函數的做用是啓動一個可執行的二進制程序: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