1. 程式人生 > >bash內置函數killproc個人理解

bash內置函數killproc個人理解

系統內置函數


killproc() {
local RC killlevel= base pid pid_file= delay try             #定義一系列局部變量
RC=0; delay=3; try=0
# Test syntax.
if [ "$#" -eq 0 ]; then                                      #參數判定
echo $"Usage: killproc [-p pidfile] [ -d delay] {program} [-signal]"             
return 1
fi
if [ "$1" = "-p" ]; then
pid_file=$2
shift 2
fi
if [ "$1" = "-d" ]; then
delay=$(echo $2 | awk -v RS=‘ ‘ -v IGNORECASE=1 ‘{if($1!~/^[0-9.]+[smhd]?$/) exit 1;d=$1~/s$|^[0-9.]*$/?1:$1~/m$/?60:$1~/h$/?60*60:$1~/d$/?24*60*60:-1;if(d==-1) exit 1;delay+=d*$1} END {printf("%d",delay+0.5)}‘)
     #將用戶指定的$2,也就是delay的值傳入awk中,此時,awk中的$1就是傳入的$2的值!!
正則判斷
1.如果$1不是以數字開頭,或者smhd結尾的字符串,那麽直接函數退出,返回1。
2.如果是純數字和.組成或者以“s”結尾,那麽將1賦給d。
3.如果是以“m”結尾,那麽將60賦給d.
4.如果是以“h”結尾,那麽將60*60賦給d.
5.如果是以“d”結尾,那麽將24*60*60賦給d.
6.都不匹配,那麽將-1賦給d
最後delay的值等於d乘以用戶指定的值。
if [ "$?" -eq 1 ]; then
echo $"Usage: killproc [-p pidfile] [ -d delay] {program} [-signal]"
return 1
fi
shift 2
fi
        
      此時,參數的指針指在program的位置,$1為program ,$2為用戶指定的終結信號
# check for second arg to be kill level                             #判定用戶是否制定了進程中介的級別
[ -n "${2:-}" ] && killlevel=$2                                     #如果存在$2
        # Save basename.               
        base=${1##*/}
        # Find pid.
__pids_var_run "$1" "$pid_file"                                     #根據進程的名字,以及進程名的文件,找到對應的進程的進程號$pid
RC=$?                                                               #記錄返回值
if [ -z "$pid" ]; then 
if [ -z "$pid_file" ]; then                                         #如果pid號的值為空,且pid文件為空
pid="$(__pids_pidof "$1")"                                          #通過pids_pidof函數找到program對應的進程號
else
[ "$RC" = "4" ] && { failure $"$base shutdown" ; return $RC ;}       #如果pid_file不可讀,那麽執行這一個分支
fi
fi
        # Kill it.
        if [ -n "$pid" ] ; then                                      #如果pid進程非空
                [ "$BOOTUP" = "verbose" -a -z "${LSB:-}" ] && echo -n "$base "
if [ -z "$killlevel" ] ; then                                        #如果用戶沒有指定Kill的等級
       if checkpid $pid 2>&1; then                                    #如果/proc下有對應的進程號文件夾,
   # TERM first, then KILL if not dead
   kill -TERM $pid >/dev/null 2>&1                                    #首先嘗試發送-term信號終於進程
   usleep 100000                                                      #睡眠100毫秒
   if checkpid $pid ; then                                              
try=0
while [ $try -lt $delay ] ; do                                        #當嘗試的次數小於設定的delay值,循環檢測/proc目錄下的進程號文件夾是否存在,如果已經不存在,就通過break退出循環
checkpid $pid || break
sleep 1
let try+=1
done
if checkpid $pid ; then                                               #如果超過設定的delay,/proc/下的進程號文件夾依舊存在,那麽通過發送-9信號強行終結進程
kill -KILL $pid >/dev/null 2>&1
usleep 100000
fi
   fi
        fi
checkpid $pid                                                            
RC=$?
[ "$RC" -eq 0 ] && failure $"$base shutdown" || success $"$base shutdown"   #如果進程號文件夾被刪除了,那麽現實,關閉成功,不然提示關閉失敗
RC=$((! $RC))                                                               #對返回值取反
# use specified level only                                                  #用戶指定kill等級的分支
else
        if checkpid $pid; then
                kill $killlevel $pid >/dev/null 2>&1                         #調用kill,根據用戶指定的等級,終於進程
RC=$?
[ "$RC" -eq 0 ] && success $"$base $killlevel" || failure $"$base $killlevel"
elif [ -n "${LSB:-}" ]; then
RC=7 # Program is not running
fi
fi
else
if [ -n "${LSB:-}" -a -n "$killlevel" ]; then                                #如果LSB非空,且查殺等級也不為空,那麽返回值賦予7
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
}



本文出自 “二菲爸的博客” 博客,請務必保留此出處http://dannniswu.blog.51cto.com/9846650/1942315

bash內置函數killproc個人理解