103 lines
3.1 KiB
Bash
103 lines
3.1 KiB
Bash
#!/bin/bash
|
|
###########################################################################
|
|
#File Name:os_rotate_and_save_log.sh
|
|
#Description: Save the source file to destination directories by size
|
|
#Parameter: It is a character string, has three values.
|
|
# parameter one, the file which needs to be saved.
|
|
# parameter two, the destination directory for saving the file.
|
|
# parameter three, logdump dir limit size
|
|
#Output:none
|
|
###########################################################################
|
|
|
|
CUR_SCRIPT=$0
|
|
PID=$(pidof -x $CUR_SCRIPT)
|
|
L_CUR_SCRIPT_RUNNING_COUNT=$(echo "$PID" | wc -w)
|
|
|
|
#can not be runned twice at the same time
|
|
if [ "${L_CUR_SCRIPT_RUNNING_COUNT}" -gt 1 ];then
|
|
echo "[$CUR_SCRIPT] $CUR_SCRIPT is running, can not run it twice at one time" >/dev/kmsg
|
|
exit 1
|
|
fi
|
|
|
|
#parse parameter
|
|
declare -a PARAM_ARRAY
|
|
PARAM_ARRAY=($1)
|
|
SRC_FILE=${PARAM_ARRAY[0]}
|
|
DEST_DIR=${PARAM_ARRAY[1]}
|
|
DIR_LIMIT_SIZE=${PARAM_ARRAY[2]}
|
|
FILE_NAME=${SRC_FILE##*/}
|
|
|
|
#get the maximum serial number
|
|
SERIEL_NUM=`ls $DEST_DIR|grep "messages-.*-.*\.tar\.bz2"|cut -d '-' -f3 |sort -nr|head -n1|cut -d '.' -f1`
|
|
if [ -z $SERIEL_NUM ];then
|
|
SERIEL_NUM=0
|
|
fi
|
|
((SERIEL_NUM=$SERIEL_NUM+1))
|
|
|
|
TMPNAME=${FILE_NAME}-`date "+%Y%m%d%H%M%S"-${SERIEL_NUM}`
|
|
TMPFILE=/tmp/$TMPNAME
|
|
|
|
#create destination directory
|
|
if [ ! -d "$DEST_DIR" ];then
|
|
mkdir -p $DEST_DIR
|
|
fi
|
|
|
|
#save the log file to /tmp/
|
|
mv $SRC_FILE $TMPFILE
|
|
|
|
#count the maximum number of bytes in the destination directory
|
|
DIR_LIMIT_SIZE_NUM=${DIR_LIMIT_SIZE%[A-Z|a-z]}
|
|
DIR_LIMIT_SIZE_UNIT=${DIR_LIMIT_SIZE##[0-9]*[0-9]}
|
|
|
|
case $DIR_LIMIT_SIZE_UNIT in
|
|
M|m)
|
|
DIR_LIMIT_SIZE_NUM=$((DIR_LIMIT_SIZE_NUM*1024*1024))
|
|
;;
|
|
K|k)
|
|
DIR_LIMIT_SIZE_NUM=$((DIR_LIMIT_SIZE_NUM*1024))
|
|
;;
|
|
esac
|
|
|
|
TAR_PKG_NAME=$TMPFILE.tar.bz2
|
|
cd /tmp
|
|
tar -cjf $TAR_PKG_NAME $TMPNAME
|
|
cd -
|
|
|
|
#count current dump file size
|
|
FILE_SIZE=`du -sb $TAR_PKG_NAME|awk '{print $1}'`
|
|
#count the maximum space that a file can occupy in the destination directory if it is to accommodate the current dump file.
|
|
((MAX_LEFT_SIZE=$DIR_LIMIT_SIZE_NUM-$FILE_SIZE))
|
|
|
|
#current total size of files
|
|
pushd $DEST_DIR >/dev/null
|
|
cursize=`du -sb|awk '{print $1}'`
|
|
#delete extraneous files when there is not enough space
|
|
if [ "$cursize" -gt "$MAX_LEFT_SIZE" ];then
|
|
irrelevant_files=`find $DEST_DIR|grep -v "^$DEST_DIR/$FILE_NAME-.*-.*\.tar\.bz2$" |grep -v "^$DEST_DIR$"`
|
|
if [ "$irrelevant_files" != "" ];then
|
|
rm -rf $irrelevant_files
|
|
echo "[$0]space of output directory $DEST_DIR will be larger than $DIR_LIMIT_SIZE bytes,delete the irrelevant files :$irrelevant_files" >/dev/kmsg
|
|
cursize=`du -sb|awk '{print $1}'`
|
|
fi
|
|
fi
|
|
|
|
#when the space is still insufficient, delete the oldest log package one by one until it can hold the latest log package
|
|
while [ $cursize -gt $MAX_LEFT_SIZE ]
|
|
do
|
|
del_file=`ls $DEST_DIR|grep "$FILE_NAME-.*-.*\.tar\.bz2"|cut -d '-' -f3|sort -n|head -n1`
|
|
if [[ $del_file == "" ]];then
|
|
break
|
|
fi
|
|
del_file=`ls|grep "$FILE_NAME-.*-$del_file"`
|
|
echo "[$0]space of output directory is larger than $DIR_LIMIT_SIZE bytes,delete the oldest tar file $del_file" >/dev/kmsg
|
|
rm -rf $del_file
|
|
|
|
cursize=`du -sb|awk '{print $1}'`
|
|
done
|
|
popd >/dev/null
|
|
|
|
mv $TAR_PKG_NAME $DEST_DIR
|
|
rm -rf $TMPFILE
|
|
|
|
exit 0
|