bash内置函数killproc个人理解
发布时间:2020-12-15 16:49:37 所属栏目:安全 来源:网络整理
导读:killproc(){localRCkilllevel=basepidpid_file=delaytry#定义一系列局部变量RC=0;delay=3;try=0#Testsyntax.if["$#"-eq0];then#参数判定echo$"Usage:killproc[-ppidfile][-ddelay]{program}[-signal]"return1fiif["$1"="-p"];thenpid_file=$2shift2fiif["$1"
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 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |