每隔一段时间, 总是要花一些时间来清理 Tomcatcatalina.out 日志, 为什么不做成脚本呢?

发现Tomcat

由于一台服务器一般会启动多个 tomcat 实例, 而为每个 tomcat 定制一个备份和清理的脚本也是挺麻烦的, 其中只是 tomcat 的安装目录不一样而已

使用 ps 就可以找到运行中的 tomcat 了:

ps aux | grep "tomcat"

这里面有 tomcat 安装目录的信息, 所以可以用 grepawk 命令匹配并截取出来:

ps aux | grep -v grep | grep "tomcat" | awk '{for(i=1;i<=NF;i++){if ($i ~ /catalina.base/){printf("%s\n", $i)}}}' | awk -F '=' '{print $2}'

是不是感觉 awk 很强大, 以至于单这个命令都可以出本书了:
The AWK Programming Language (AWK 程序设计语言) 中文翻译, LaTeX 排版

备份

使用简单的 cpecho 命令即可实现备份的目的, 不过这种办法比较粗糙, 可能造成部分日志丢失! 不过控制台日志一般没那么高要求的

清空文件:(不删除)

echo "" > /path/file

一天备份一次即可, 如果已经有了就不用备份了

清理

使用 findxargsrm 就可以实现: 超过 N天 的文件删除掉

find /path/logs/ -name "*.log.*" -type f -mtime +3 | xargs rm -rf

定时任务

加入定时任务

# 编辑定时任务,一行代表一个定时任务
# "58 23 * * *" 代表每天的 23:58:00 执行任务
$ crontab -e
58 23 * * * sh /usr/local/myscript/rotate_tomcat_log.sh

这样就不用管一台服务器有多少个 tomcat 了, 全部自动化备份和清理, 终于可以摆脱清理的烦恼了. 不过还有个缺点: 每台服务器得操作一遍, 暂时没想到更好的办法…

脚本完整版

/usr/local/myscript/rotate_tomcat_log.sh

#!/bin/bash
#author:xu3352@gmail.com
#desc: rotate tomcat catalina.out daily

do_job() {
    local DATE=`date "+%Y%m%d"`
    # tomcat base dir list
    local TOMCAT_BASES=(`ps aux | grep -v grep | grep "tomcat" | awk '{for(i=1;i<=NF;i++){if ($i ~ /catalina.base/){printf("%s\n", $i)}}}' | awk -F '=' '{print $2}'`)

    local LEN=${#TOMCAT_BASES[*]}
    # echo "LEN:" $LEN

    for (( i=0; i<$LEN; i++ ))
    do
        echo "Tomcat Base Dir : ${TOMCAT_BASES[i]}"
        backup "${TOMCAT_BASES[i]}"
        clean_expired "${TOMCAT_BASES[i]}"
        echo "backup and clean success ^_^ "
    done
}

backup() {
    cd $1/logs/
    if [ ! -f "catalina.out.$DATE" ]; then
        echo "backup to catalina.out.$DATE if not exists..."
        # copy
        cp catalina.out catalina.out.$DATE
        # truncate
        echo "" > catalina.out
    fi
}

clean_expired() {
    echo "clean expired 3 days catalina.out log..."
    find $1/logs/ -name "catalina.out.*" -type f -mtime +3 | xargs rm -rf
}

# start job
do_job

脚本使用函数式的写法, 注意参数的传递写法跟调用脚本的写法类似: $1, $2, $3 ...


参考:



blog comments powered by Disqus

Published

21 August 2017

Tags