bash内置函数killproc个人理解

前端之家收集整理的这篇文章主要介绍了bash内置函数killproc个人理解前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。


  1. killproc(){
  2. localRCkilllevel=basepidpid_file=delaytry#定义一系列局部变量
  3. RC=0;delay=3;try=0
  4. #TestSyntax.
  5. if["$#"-eq0];then#参数判定
  6. echo$"Usage:killproc[-ppidfile][-ddelay]{program}[-signal]"
  7. return1
  8. fi
  9. if["$1"="-p"];then
  10. pid_file=$2
  11. shift2
  12. fi
  13. if["$1"="-d"];then
  14. 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)}')
  15. #将用户指定的$2,也就是delay的值传入awk中,此时,awk中的$1就是传入的$2的值!!
  16. 正则判断
  17. 1.如果$1不是以数字开头,或者smhd结尾的字符串,那么直接函数退出,返回1
  18. 2.如果是纯数字和.组成或者以“s”结尾,那么将1赋给d
  19. 3.如果是以“m”结尾,那么将60赋给d.
  20. 4.如果是以“h”结尾,那么将60*60赋给d.
  21. 5.如果是以“d”结尾,那么将24*60*60赋给d.
  22. 6.都不匹配,那么将-1赋给d
  23. 最后delay的值等于d乘以用户指定的值。
  24. if["$?"-eq1];then
  25. echo$"Usage:killproc[-ppidfile][-ddelay]{program}[-signal]"
  26. return1
  27. fi
  28. shift2
  29. fi
  30.  
  31. 此时,参数的指针指在program的位置,$1program,$2用户指定的终结信号
  32. #checkforsecondargtobekilllevel#判定用户是否制定了进程中介的级别
  33. [-n"${2:-}"]&&killlevel=$2#如果存在$2
  34. #Savebasename.
  35. base=${1##*/}
  36. #Findpid.
  37. __pids_var_run"$1""$pid_file"#根据进程的名字,以及进程名的文件,找到对应的进程的进程号$pid
  38. RC=$?#记录返回值
  39. if[-z"$pid"];then
  40. if[-z"$pid_file"];then#如果pid号的值为空,且pid文件为空
  41. pid="$(__pids_pidof"$1")"#通过pids_pidof函数找到program对应的进程号
  42. else
  43. ["$RC"="4"]&&{failure$"$baseshutdown";return$RC;}#如果pid_file不可读,那么执行这一个分支
  44. fi
  45. fi
  46. #Killit.
  47. if[-n"$pid"];then#如果pid进程非空
  48. ["$BOOTUP"="verbose"-a-z"${LSB:-}"]&&echo-n"$base"
  49. if[-z"$killlevel"];then#如果用户没有指定Kill的等级
  50. ifcheckpid$pid2>&1;then#如果/proc下有对应的进程号文件夹,
  51. #TERMfirst,thenKILLifnotdead
  52. kill-TERM$pid>/dev/null2>&1#首先尝试发送-term信号终于进程
  53. usleep100000#睡眠100毫秒
  54. ifcheckpid$pid;then
  55. try=0
  56. while[$try-lt$delay];do#当尝试的次数小于设定的delay值,循环检测/proc目录下的进程号文件夹是否存在,如果已经不存在,就通过break退出循环
  57. checkpid$pid||break
  58. sleep1
  59. lettry+=1
  60. done
  61. ifcheckpid$pid;then#如果超过设定的delay,/proc/下的进程号文件夹依旧存在,那么通过发送-9信号强行终结进程
  62. kill-KILL$pid>/dev/null2>&1
  63. usleep100000
  64. fi
  65. fi
  66. fi
  67. checkpid$pid
  68. RC=$?
  69. ["$RC"-eq0]&&failure$"$baseshutdown"||success$"$baseshutdown"#如果进程号文件夹被删除了,那么现实,关闭成功,不然提示关闭失败
  70. RC=$((!$RC))#对返回值取反
  71. #usespecifiedlevelonly#用户指定kill等级的分支
  72. else
  73. ifcheckpid$pid;then
  74. kill$killlevel$pid>/dev/null2>&1#调用kill,根据用户指定的等级,终于进程
  75. RC=$?
  76. ["$RC"-eq0]&&success$"$base$killlevel"||failure$"$base$killlevel"
  77. elif[-n"${LSB:-}"];then
  78. RC=7#Programisnotrunning
  79. fi
  80. fi
  81. else
  82. if[-n"${LSB:-}"-a-n"$killlevel"];then#如果LSB非空,且查杀等级也不为空,那么返回值赋予7
  83. RC=7#Programisnotrunning
  84. else
  85. failure$"$baseshutdown"
  86. RC=0
  87. fi
  88. fi
  89. #Removepidfileifany.
  90. if[-z"$killlevel"];then
  91. rm-f"${pid_file:-/var/run/$base.pid}"
  92. fi
  93. return$RC
  94. }

猜你在找的Bash相关文章