前端之家收集整理的这篇文章主要介绍了
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
- }