EL 5 上 /etc/init.d/functions 中声明的含义

Posted

技术标签:

【中文标题】EL 5 上 /etc/init.d/functions 中声明的含义【英文标题】:Meaning of declarations in /etc/init.d/functions on EL 5 【发布时间】:2014-06-05 06:53:47 【问题描述】:

当谈到 Bash shell 脚本时,我是个业余爱好者,并且对 CentOS 5.10 系统上 /etc/init.d/functions 中 killproc() 函数的第一行感到困惑:

local RC killlevel= base pid pid_file= delay try

那条线是什么意思?我相信这可能是局部变量的声明,但是在几个项目之后 = 的含义是什么?我在下面包含了完整的 killproc() 函数以供参考:

# A function to stop a program.
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)')
        if [ "$?" -eq 1 ]; then
            echo $"Usage: killproc [-p pidfile] [ -d delay] program [-signal]"
            return 1
        fi
        shift 2
    fi


    # check for second arg to be kill level
    [ -n "$2:-" ] && killlevel=$2

        # Save basename.
        base=$1##*/

        # Find pid.
    __pids_var_run "$1" "$pid_file"
    if [ -z "$pid_file" -a -z "$pid" ]; then
        pid="$(__pids_pidof "$1")"
    fi

        # Kill it.
        if [ -n "$pid" ] ; then
                [ "$BOOTUP" = "verbose" -a -z "$LSB:-" ] && echo -n "$base "
        if [ -z "$killlevel" ] ; then
               if checkpid $pid 2>&1; then
               # TERM first, then KILL if not dead
               kill -TERM $pid >/dev/null 2>&1
               usleep 100000
               if checkpid $pid ; then
                try=0
                while [ $try -lt $delay ] ; do
                    checkpid $pid || break
                    sleep 1
                    let try+=1
                done
                if checkpid $pid ; then
                    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
        else
                if checkpid $pid; then
                        kill $killlevel $pid >/dev/null 2>&1
                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
            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

【问题讨论】:

【参考方案1】:

它只是声明了很多函数范围变量,其中killlevelpid_file被分配了空字符串,而其他的则没有分配任何东西。

略有不同。 local 变量在从函数调用的函数中也可见。因此,如果您碰巧以递归方式调用killproc(),则会从调用者那里记住未初始化的那些。

在 Debian 上,lib/lsb/init-functions 文件如下所示:

killproc() 
    local pidfile sig status base name_param is_term_sig OPTIND
    pidfile=                                                   
    name_param=                                                
    is_term_sig=                                               

【讨论】:

而here 是来自 bash 手册的参考。

以上是关于EL 5 上 /etc/init.d/functions 中声明的含义的主要内容,如果未能解决你的问题,请参考以下文章

在 Mac OS X El Capitan 10.11.4 上安装 MySQL 5.7

用rpm包在centos7.4上安装mysql-5.7.29-1.el7.x86_64

用rpm包在centos7.4上安装mysql-5.7.24-1.el7.x86_64

Centos7上卸载MariaDB数据库,安装mysql

centos服务器上怎么安装mysql

red hat linux下如何把php-5.1.6-27.el5升级PHP 5.2.4