前端之家收集整理的这篇文章主要介绍了
bash内置函数killproc个人理解,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
killproc(){
localRCkilllevel=basepidpid_file=delaytry#定义一系列局部变量
RC=0;delay=3;try=0
#TestSyntax.
if["$#"-eq0];then#参数判定
echo$"Usage:killproc[-ppidfile][-ddelay]{program}[-signal]"
return1
fi
if["$1"="-p"];then
pid_file=$2
shift2
fi
if["$1"="-d"];then
delay=$(echo$2|awk-vRS=''-vIGNORECASE=1'{if($1!~/^[0-9.]+[smhd]?$/)exit1;d=$1~/s$|^[0-9.]*$/?1:$1~/m$/?60:$1~/h$/?60*60:$1~/d$/?24*60*60:-1;if(d==-1)exit1;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["$?"-eq1];then
echo$"Usage:killproc[-ppidfile][-ddelay]{program}[-signal]"
return1
fi
shift2
fi
此时,参数的指针指在program的位置,$1为program,$2为用户指定的终结信号
#checkforsecondargtobekilllevel#判定用户是否制定了进程中介的级别
[-n"${2:-}"]&&killlevel=$2#如果存在$2
#Savebasename.
base=${1##*/}
#Findpid.
__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$"$baseshutdown";return$RC;}#如果pid_file不可读,那么执行这一个分支
fi
fi
#Killit.
if[-n"$pid"];then#如果pid进程非空
["$BOOTUP"="verbose"-a-z"${LSB:-}"]&&echo-n"$base"
if[-z"$killlevel"];then#如果用户没有指定Kill的等级
ifcheckpid$pid2>&1;then#如果/proc下有对应的进程号文件夹,
#TERMfirst,thenKILLifnotdead
kill-TERM$pid>/dev/null2>&1#首先尝试发送-term信号终于进程
usleep100000#睡眠100毫秒
ifcheckpid$pid;then
try=0
while[$try-lt$delay];do#当尝试的次数小于设定的delay值,循环检测/proc目录下的进程号文件夹是否存在,如果已经不存在,就通过break退出循环
checkpid$pid||break
sleep1
lettry+=1
done
ifcheckpid$pid;then#如果超过设定的delay,/proc/下的进程号文件夹依旧存在,那么通过发送-9信号强行终结进程
kill-KILL$pid>/dev/null2>&1
usleep100000
fi
fi
fi
checkpid$pid
RC=$?
["$RC"-eq0]&&failure$"$baseshutdown"||success$"$baseshutdown"#如果进程号文件夹被删除了,那么现实,关闭成功,不然提示关闭失败
RC=$((!$RC))#对返回值取反
#usespecifiedlevelonly#用户指定kill等级的分支
else
ifcheckpid$pid;then
kill$killlevel$pid>/dev/null2>&1#调用kill,根据用户指定的等级,终于进程
RC=$?
["$RC"-eq0]&&success$"$base$killlevel"||failure$"$base$killlevel"
elif[-n"${LSB:-}"];then
RC=7#Programisnotrunning
fi
fi
else
if[-n"${LSB:-}"-a-n"$killlevel"];then#如果LSB非空,且查杀等级也不为空,那么返回值赋予7
RC=7#Programisnotrunning
else
failure$"$baseshutdown"
RC=0
fi
fi
#Removepidfileifany.
if[-z"$killlevel"];then
rm-f"${pid_file:-/var/run/$base.pid}"
fi
return$RC
}
原文链接:https://www.f2er.com/bash/392455.html