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 }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。