标签:系统内置函数
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
标签:系统内置函数
原文地址:http://dannniswu.blog.51cto.com/9846650/1942315