linux的functions之killproc函數詳解

# 該函數的做用是關閉進程的.# 用法:# killproc [-p pidfile] [-d delay] <program> [-signal]# -p:  指定進程的pid文件,通常在/var/run/xxx.pid# -d:  指定延遲多長時間就強度關閉進程# -signal: 關閉進程的信號# A function to stop a program.             killproc() {
        local RC killlevel= base pid pid_file= delay     
        # 定義局部變量,只在函數體內有效。
        RC=0; delay=3  # 默認延遲3秒,不能正常關閉就強制關閉
        # Test syntax. # 判斷用戶調用該函數時,給的參數格式。並使用變量記錄下來
        if [ "$#" -eq 0 ]; then
                echo $"Usage: killproc [-p pidfile] [ -d delay] {program} [-signal]「
        # 若是調用該函數時,不使用任何參數的話將給用戶輸出使用該函數的使用方法。                                                                         
                return 1       # 退出該函數。
        fi
        if [ "$1" = "-p" ]; then   
                # 若是參數1,是字符 -p 的話,那麼用戶輸入的第二個參數就是:
                # 程序的pid_file文件。一般是/var/run/XXX.pid
                pid_file=$2    
                shift 2         
        fi
        if [ "$1" = "-d" ]; then
                delay=$2    
                # 記錄的參數的做用是用來。若是進程在正常狀況下不能關閉,
                # 延遲多長時間就向該進程發送SIGKILL信號強制關閉。
                shift 2
        fi
        # check for second arg to be kill level 
        # 檢查用戶是否指定函數關閉進程時,所使用的信號。
        [ -n "${2:-}" ] && killlevel=$2
        # Save basename.       # 保存進程的二進制運行文件的。
        base=${1##*/}          # 參數替換,把程序的二進制文件的路徑名***掉。
####################################################################
        # 查找可運行二進制程序的進程號PID 部分
        # Find pid.
        __pids_var_run "$1" "$pid_file"     
        #調用 函數:__pids_var_run 來檢查用戶指定的程序的進程號。
        # 該函數會使用一個變量:PID記錄程序的進程號的。
        if [ -z "$pid_file" -a -z "$pid" ]; then 
        # 若是pidfile文件不存在,而且找不到進程的pid號。
        # 就使用該方法查找該程序$base的PID號。
                pid="$(__pids_pidof "$1")"
        fi
 #####################################################################
        # Kill it.       
        # 找到二進制可運行程序的進程號,是若是關閉進程的
        if [ -n "$pid" ] ; then 
                       # 若是$PID 不爲空,證實進程運行的。就執行 then 後的內容
                [ "$BOOTUP" = "verbose" -a -z "${LSB:-}" ] && echo -n "$base "
                if [ -z "$killlevel" ] ; then  
               #若是用戶沒有指定函數要使用關閉進程的信號的話,就執行 then後的內容
                       if checkpid $pid 2>&1; then  
                        # 調用函數:checkpid 來判斷進程號爲:$PID的進程是否
                        #運行。其實 checkpid是判斷$PID,若是僞目錄/proc 
                        #下是否有一個目錄名和$PID相同
                           # TERM first, then KILL if not dead
                           kill -TERM $pid >/dev/null 2>&1   
                           # 給進程$PID發送 -15信號。等待進程關閉資源後,
                           # 再殺死該進程。
                           usleep 100000   #等待100000 微秒
                           if checkpid $pid && sleep 1 && 
                               #再使用函數checkpid檢查,若是進程還運行的話,
                               #再等待1秒,
                              checkpid $pid && sleep $delay &&  
                              #再使用函數checkpid檢查,若是進程還運行的話,
                              #就使用用戶給的延遲時間,再等待
                              checkpid $pid ; then      
                                #在用戶給的延時時間到了,再次使用函數
                                #checkpid檢查,若是進程仍是運行的
                                # 話,就強制關閉。
                                kill -KILL $pid >/dev/null 2>&1  
                                # 給進程$PID發送 -9 信號,強制關閉該進程。
                                usleep 100000
                           fi
                        fi
                        checkpid $pid  # 再次確認下,進程$PID是不是關閉的。
                        RC=$?     
                           # 記錄函數checkpid的返回結果。
                           # 若是是:0 的話就表明關閉進程$PID成功。
                        [ "$RC" -eq 0 ] && failure $"$base shutdown" || success   $"$base shutdown"
              # 判斷函數checkpid的返回值,給用戶輸出進程是否關閉成功的信                        RC=$((! $RC))  
                   # 對變量RC進行,非操做,避免下面使用該變量時,判斷有誤。
                # use specified level only
                  #調用函數:killproc時傳遞有關閉進程的信號就執行else 後的程序
                else   # 若是用戶給函數killproc 傳遞了關閉進程所使用的信號,
                       #就執行else後的代碼
            # 做用想要通知進程重讀配置文件時, 能夠傳遞一個 -HUP 信號給進程。
                        if checkpid $pid; then                                                  #使用函數checkpid檢查,進程$PID是否運行的,

                       kill $killlevel $pid >/dev/null 2>&1    
                             #使用用戶傳遞關閉進程的信號來關閉進程$PID
                                RC=$?  #記錄函數checkpid的返回結果。 
                                [ "$RC" eq 0 ] && success $"$base $killlevel"  || failure $"$base $killlevel"    
                             # 根據$RC判斷進程$PID是否關閉成功                                                
                      elif [ -n "${LSB:-}" ]; then   
                                RC=7 # Program is not running
                        fi
                fi
                 ###########################找不到二進制可運行程序的進程號
        else
                if [ -n "${LSB:-}" -a -n "$killlevel" ]; then
                        RC=7 # Program is not running
                else
                        failure $"$base shutdown"
                        RC=0
                fi
        fi
        # Remove pid file if any.
        if [ -z "$killlevel" ]; then
            rm -f "${pid_file:-/var/run/$base.pid}"        fi
        return $RC}


https://blog.51cto.com/9528du/1420086web

相關文章
相關標籤/搜索