util

#!/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

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容