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