util

作者: geeksforgeeks | 来源:发表于2017-06-01 17:42 被阅读0次

    #!/bin/bash

    ########################################################################

    #

    #  FUNCTION  : main

    #  DESCRIPTION: copy dir to

    #  CALLS      : 无

    #  CALLED BY  : 无

    #  INPUT      : 无

    #  OUTPUT    : 无

    #  LOCAL VAR  : 无

    #  USE GLOBVAR: 无

    #  RETURN    : 无

    #  CHANGE DIR : 无

    #######################################################################

    #####################################################

    # 用户相关变量

    ######################################################

    SERVICE_USER=des

    SERVICE_GROUP=des

    MODULE_NAME=console-home

    MODULE_PATH=des

    #####################################################

    #

    # 安装路径

    #

    #####################################################

    PRODUCT_PATH=/opt/des/console-des

    TOMCAT_PATH=/opt/des/tomcat1212

    RETURN_CODE_SUCCESS=0

    RETURN_CODE_ERROR=1

    #对应缺省:目录700 文件600权限

    umask 0077

    LOGMAXSIZE=5120

    BASE_LOGGER_PATH=/var/log/${MODULE_PATH}

    ######################################################################

    #  FUNCTION    : chkUser

    #  DESCRIPTION  : 检查当前用户是否是$SERVICE_USER

    #  CALLS        : 无

    #  CALLED BY    : 任何需要调用此函数的地方

    #  INPUT        : $1    想要检查的用户名

    #  OUTPUT      : 无

    #  READ GLOBVAR : 无

    #  WRITE GLOBVAR: 无

    #  RETURN      :  0  成功

    #                  1  失败

    ######################################################################

    chkUser()

    {

    logger_without_echo "check current user"

    local curUser=$(/usr/bin/whoami | /usr/bin/awk '{print $1}')

    if [ "$curUser" = "$SERVICE_USER" ]; then

    logger_without_echo "check current user success"

    return 0

    else

    die "${MODULE_NAME} can only run by ${SERVICE_USER}"

    fi

    }

    ######################################################################

    #  FUNCTION    : initLogDir

    #  DESCRIPTION  : 创建日志目录

    #  CALLS        : 无

    #  CALLED BY    : 本脚本初始化日志

    #  INPUT        : 无

    #  OUTPUT      : 无

    #  READ GLOBVAR : 无

    #  WRITE GLOBVAR: 无

    #  RETURN      : 无

    ######################################################################

    initLogDir()

    {

    if [ -e "$LOGGER_PATH" ]; then

    return 0

    else

    mkdir -p ${LOGGER_PATH}

    echo "init log dir success."

    fi

    }

    ######################################################################

    #  FUNCTION    : status

    #  DESCRIPTION  : 检查当前进程状态

    #  CALLS        : 无

    #  CALLED BY    : 任何需要调用此函数的地方

    #  INPUT        : $1    想要检查的进程名

    #  OUTPUT      : 无

    #  READ GLOBVAR : 无

    #  WRITE GLOBVAR: 无

    #  RETURN      :  0  成功

    #                  1  失败

    ######################################################################

    internalStatus()

    {

    # do some work, such as send one msg to process

    local pid=$(ps -ww -eo pid,cmd | grep -w "${MODULE_NAME}.main.proc" |grep -w java | grep -vwE "grep|vi|vim|tail|cat" | awk '{print $1}' | head -1)

    RETVAL=${RETURN_CODE_ERROR}

    [ -n "$pid" ] && RETVAL=${RETURN_CODE_SUCCESS}

    if [ "$RETVAL" -eq ${RETURN_CODE_SUCCESS} ]; then

    logger_without_echo "normal"

    else

    logger_without_echo "abnormal"

    fi

    return "$RETVAL"

    }

    ######################################################################

    #  FUNCTION    : logger_without_echo

    #  DESCRIPTION  : 记录日志到对应文件中,不输出到终端。

    #  CALLS        : 无

    #  CALLED BY    : 无

    #  INPUT        : 无

    #  OUTPUT      : 无

    #  READ GLOBVAR : 无

    #  WRITE GLOBVAR: 无

    #  RETURN      : 无

    ######################################################################

    logger_without_echo()

    {

    local logsize=0

    if [ -e "$LOGGER_FILE" ]; then

    logsize=`ls -lk ${LOGGER_FILE} | awk -F " " '{print $5}'`

    else

    touch ${LOGGER_FILE}

    chown ${SERVICE_USER}: ${LOGGER_FILE}

    chmod 600 ${LOGGER_FILE}

    fi

    if [ "$logsize" -gt "$LOGMAXSIZE" ]; then

    # 每次删除10000行,约300K

    sed -i '1,10000d' "$LOGGER_FILE"

    fi

    echo "[` date -d today +\"%Y-%m-%d %H:%M:%S\"`,000] $*" >>"$LOGGER_FILE"

    }

    ######################################################################

    #  FUNCTION    : logger

    #  DESCRIPTION  : 记录日志到对应文件中,同时输出到终端。

    #  CALLS        : 无

    #  CALLED BY    : 无

    #  INPUT        : 无

    #  OUTPUT      : 无

    #  READ GLOBVAR : 无

    #  WRITE GLOBVAR: 无

    #  RETURN      : 无

    ######################################################################

    logger()

    {

    logger_without_echo $*

    echo "$*"

    }

    ######################################################################

    #  FUNCTION    : die

    #  DESCRIPTION  : 记录日志并退出程序。

    #  CALLS        : 无

    #  CALLED BY    : 无

    #  INPUT        : 无

    #  OUTPUT      : 无

    #  READ GLOBVAR : 无

    #  WRITE GLOBVAR: 无

    #  RETURN      : 无

    ######################################################################

    die()

    {

    logger "$*"

    exit ${RETURN_CODE_ERROR}

    }

    ERR_GET_LOCK=101

    ERR_PARAMETERS=102

    #######################################################################

    # shell文件锁封装函数,

    # 参数1:文件锁路径,

    # 参数2,需要上锁的实际执行动作,

    # 参数3~n,传给实际动作的所有参数

    lockWrapCall()

    {

    local lockFile=$1

    local action=$2

    [ -n "$lockFile" -a -n "$action" ] || return $ERR_PARAMETERS

    local dirName=$(dirname $lockFile)

    [ -d "$dirName" ] || return $ERR_PARAMETERS

    shift 2

    # 定义信号捕捉流程,异常停止进程时清除文件锁

    trap 'rm -f $lockFile; logger "trap a stop singal"' 1 2 3 15

    ####################################

    ## 文件锁,只允许一个进程执行

    ####################################

    {

    flock -no 100

    if [ $? -eq 1 ]; then

    local lockPid=$(cat $lockFile)

    lockPid=$(echo $lockPid)

    if [ -z "$lockPid" ]; then

    logger "can't get lock file:$lockFile, lockPid is empty, no need to run $action"

    return $ERR_GET_LOCK

    else

    lockPid=$(echo $lockPid)

    local openPids=$(lsof -Fp $lockFile)

    if echo "$openPids" | grep "^p${lockPid}$" > /dev/null; then

    logger "can't get lock file:$lockFile, lockPid:$lockPid is running, no need to run $action"

    return $ERR_GET_LOCK

    fi

    fi

    logger "success get lock file:$lockFile, lockPid:$lockPid is not running"

    fi

    echo $$ > $lockFile

    $action "$@"

    local ret=$?

    # 删除文件锁,使得上述动作参数的子进程不再持有锁

    rm -f $lockFile

    return $ret

    } 100<>$lockFile

    # 恢复为默认信号处理

    trap '-' 1 2 3 15

    }

    相关文章

      网友评论

          本文标题:util

          本文链接:https://www.haomeiwen.com/subject/vvvefxtx.html