# 該函數的做用是關閉進程的.# 用法:# 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