bash内置函数killproc个人理解

killproc() {
local RC killlevel= base pid pid_file= delay try             #定义一系列局部变量
RC=0; delay=3; try=0
# Test syntax.
if [ "$#" -eq 0 ]; then                                      #参数判定
echo $"Usage: killproc [-p pidfile] [ -d delay] {program} [-signal]"             
return 1
fi
if [ "$1" = "-p" ]; then
pid_file=$2
shift 2
fi
if [ "$1" = "-d" ]; then
delay=$(echo $2 | awk -v RS=‘ ‘ -v IGNORECASE=1 ‘{if($1!~/^[0-9.]+[smhd]?$/) exit 1;d=$1~/s$|^[0-9.]*$/?1:$1~/m$/?60:$1~/h$/?60*60:$1~/d$/?24*60*60:-1;if(d==-1) exit 1;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 [ "$?" -eq 1 ]; then
echo $"Usage: killproc [-p pidfile] [ -d delay] {program} [-signal]"
return 1
fi
shift 2
fi
        
      此时,参数的指针指在program的位置,$1为program ,$2为用户指定的终结信号
# check for second arg to be kill level                             #判定用户是否制定了进程中介的级别
[ -n "${2:-}" ] && killlevel=$2                                     #如果存在$2
        # Save basename.               
        base=${1##*/}
        # Find pid.
__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 $"$base shutdown" ; return $RC ;}       #如果pid_file不可读,那么执行这一个分支
fi
fi
        # Kill it.
        if [ -n "$pid" ] ; then                                      #如果pid进程非空
                [ "$BOOTUP" = "verbose" -a -z "${LSB:-}" ] && echo -n "$base "
if [ -z "$killlevel" ] ; then                                        #如果用户没有指定Kill的等级
       if checkpid $pid 2>&1; then                                    #如果/proc下有对应的进程号文件夹,
   # TERM first, then KILL if not dead
   kill -TERM $pid >/dev/null 2>&1                                    #首先尝试发送-term信号终于进程
   usleep 100000                                                      #睡眠100毫秒
   if checkpid $pid ; then                                              
try=0
while [ $try -lt $delay ] ; do                                        #当尝试的次数小于设定的delay值,循环检测/proc目录下的进程号文件夹是否存在,如果已经不存在,就通过break退出循环
checkpid $pid || break
sleep 1
let try+=1
done
if checkpid $pid ; then                                               #如果超过设定的delay,/proc/下的进程号文件夹依旧存在,那么通过发送-9信号强行终结进程
kill -KILL $pid >/dev/null 2>&1
usleep 100000
fi
   fi
        fi
checkpid $pid                                                            
RC=$?
[ "$RC" -eq 0 ] && failure $"$base shutdown" || success $"$base shutdown"   #如果进程号文件夹被删除了,那么现实,关闭成功,不然提示关闭失败
RC=$((! $RC))                                                               #对返回值取反
# use specified level only                                                  #用户指定kill等级的分支
else
        if checkpid $pid; then
                kill $killlevel $pid >/dev/null 2>&1                         #调用kill,根据用户指定的等级,终于进程
RC=$?
[ "$RC" -eq 0 ] && success $"$base $killlevel" || failure $"$base $killlevel"
elif [ -n "${LSB:-}" ]; then
RC=7 # Program is not running
fi
fi
else
if [ -n "${LSB:-}" -a -n "$killlevel" ]; then                                #如果LSB非空,且查杀等级也不为空,那么返回值赋予7
RC=7 # Program is not running
else
failure $"$base shutdown"
RC=0
fi
fi
        # Remove pid file if any.
if [ -z "$killlevel" ]; then
            rm -f "${pid_file:-/var/run/$base.pid}"
fi
return $RC
}
时间: 2024-11-09 04:23:01

bash内置函数killproc个人理解的相关文章

Python中的内置函数__init__()的理解

有点意思,本来我是学习java的.总所周知,java也有构造函数,而python在面向对象的概念中,也有构造函数.它就是 __init__(self) 方法. 其实类似于__init__()这种方法,其实还有很多.类似__del__(self)  ...  __new__(cls,*args,**kwd) 等等.它们被成为 python的常用内置方法. 下面开始介绍一下我对 __init__()的理解: class A(object): def __init__(self,name):  sel

让你深刻理解PHP内置函数的重要性

这里请大家先看一篇文章:https://my.oschina.net/sharephper/blog/100099 看完这篇文章后的感受不言而喻,如题.我在写这篇随笔之前曾想过第一个问题,如何不用这个内置函数来做,但是目前实力不够,想不出来,以后想出来我会补上. 这里我就介绍如下PHP内置函数: array array_count_values ( array $input ) 统计数组中所有的值出现的次数.返回值是一个一维数组,用原数组的值作为键,出现的次数作为值. 参数就是要统计的数组. 例

python登录加随机验证码校验程序(装饰器内置函数的理解)

使用说明:为了防止恶意攻击,同时不对原先用户登录验证的方法代码进行改动,在检验账号密码方法外再套一层校验方法(验证码),过滤非人为的攻击. 代码如下: #!/usr/bin/env python # -*- coding:utf-8 -*- import os import json import random ###取得绝对路径下的账号密码文件 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) filepa

python基础-匿名函数、内置函数、正则表达式、模块

1. 匿名函数 1.1 有名函数 有名函数:定义了一个函数名,函数名指向内存地址:通过函数名进行访问.函数名加括号就可以运行有名函数,例如:func() def func(x, y, z = 1): return x + y + z print(func(1,5,2)) 1.2 匿名函数 匿名函数:没有名字的函数,定义的时候不需要函数名:定义匿名函数的关键字是:lambda 特点: 1.没有函数名 2.函数自带return 应用场景: 1.应用于一次性的地方 2.临时使用 salaries={

匿名函数、内置函数与模块

一.匿名函数 Python使用lambda来创建匿名函数,不再使用def语句这样标准的形式定义一个函数 lambda只是一个表达式,函数体比def简单很多 lambda的主体是一个表达式,而不是一个代码块.仅仅能在lambda表达式中封装有限的逻辑进去 lambda函数拥有自己的名称空间,且不能访问自有参数列表之外或全局名称空间里的参数 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率 适合临时的一次性的使用场景 语法:

python笔记5:装饰器、内置函数、json

装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象. 先看简单例子: def run(): time.sleep(1) print('run....') 现有一个新的需求,希望可以记录下函数的运行时间,需要在代码中计算时间的代码: def run(): start_time = time.time() time.sleep(1) print('run....') end_time = time.time() pr

day3-函数,递归,内置函数

day3-函数,递归,内置函数 作者:矮哥 归档:学习笔记 2017/01/28 1.函数是什么? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,具体区别,我们后面会讲,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫做subroutine(子过程或子程序),在Pascal中叫做procedure(过程)和function,在C中只有function,在Java里面叫做method. 定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个

Python经常使用内置函数介绍【filter,map,reduce,apply,zip】

Python是一门非常简洁,非常优雅的语言,其非常多内置函数结合起来使用,能够使用非常少的代码来实现非常多复杂的功能,假设相同的功能要让C/C++/Java来实现的话,可能会头大,事实上Python是将复杂的数据结构隐藏在内置函数中,用C语言来实现,所以仅仅要写出自己的业务逻辑Python会自己主动得出你想要的结果.这方面的内置函数主要有,filter,map,reduce,apply,结合匿名函数,列表解析一起使用,功能更加强大.使用内置函数最显而易见的优点是: 1. 速度快,使用内置函数,比

Python内置函数详解

置顶   内置函数详解 https://docs.python.org/3/library/functions.html?highlight=built#ascii 此文参考了别人整理好的东西(地址:http://www.cnblogs.com/sesshoumaru/p/6140987.html#p1),然后结合自己的理解,写下来,一方面方便自己,让自己好好学习,顺便回忆回忆:另一方面,让喜欢的盆友也参考一下. 经查询,3.6版本总共有68个内置函数,主要分类如下: 数学运算(7个) 类型转换