1.脚本目录
[demo@iZuf66lb4ux3z43gzhrbcdZ 2023-12-09]$ /home/demo/sbin/
2.脚本权限修改
chmod +x xx.sh
3.脚本内容
chmod +x xx.sh
3.1 cleanYesterdayLog.sh
对昨天之前的日志进行压缩
#!/bin/bash
# 指定目录
log_dir="/home/demo/logs"
# 获取昨天日期,格式为 yyyy-MM-dd
yesterday_date=$(date -d "yesterday" "+%Y-%m-%d")
# 拼接昨天日期目录的路径
yesterday_date_dir="${log_dir}/${yesterday_date}"
# 检查目录是否存在
if [ -d "${yesterday_date_dir}" ]; then
# 切换到指定日期目录
cd "${yesterday_date_dir}" || exit 1
# 查找 .log 文件并进行压缩
find . -type f -name "*.log" -exec ls -t {} + | while read -r log_file; do
# 获取文件名(不包含扩展名)
base_name=$(basename "${log_file}" .log)
# 获取文件的修改时间,格式为 HHMM
modification_time=$(stat -c %y "${log_file}" | cut -d ' ' -f 2 | cut -d ':' -f 1,2 | tr ':' '.')
# 压缩文件
tar -czvf "${base_name}.${modification_time}.tar.gz" "${log_file}"
echo "压缩完成:${base_name}.${modification_time}.tar.gz"
# 删除已压缩的日志文件
rm "${log_file}"
echo "已删除yesterday file:${log_file}"
done
else
echo "yesterday目录不存在:${yesterday_date_dir}"
fi
第二种是只压缩昨天如skyapm-20240503.log 2024-04-27.3.log 2024-05-02.log格式的日志
#!/bin/bash
# 获取昨天的日期格式(YYYY-MM-DD)
YESTERDAY=$(date --date="yesterday" +"%Y-%m-%d")
# 定义日志目录
LOG_DIR="/home/demo/logs/"
# 遍历日志目录及其子目录
find "$LOG_DIR" -type f -name "${YESTERDAY}*.log" | while read -r LOG_FILE; do
# 获取文件所在的目录
DIR=$(dirname "$LOG_FILE")
# 构造压缩文件名(不包括路径)
BASENAME=$(basename "$LOG_FILE")
TAR_FILE="${DIR}/${BASENAME%.log}.tar.gz"
# 执行压缩并删除原文件
tar -czvf "$TAR_FILE" "$LOG_FILE" && rm "$LOG_FILE"
# 检查命令是否成功执行
if [ $? -eq 0 ]; then
echo "File $LOG_FILE compressed and deleted successfully."
else
echo "Failed to compress and delete file $LOG_FILE."
fi
done
YESTERDAY_YYYYMMDD=$(date --date="yesterday" +"%Y%m%d")
find "$LOG_DIR" -type f -name "skyapm-${YESTERDAY_YYYYMMDD}.log" | while read -r LOG_FILE; do
# 获取文件所在的目录
DIR=$(dirname "$LOG_FILE")
# 构造压缩文件名(不包括路径)
BASENAME=$(basename "$LOG_FILE")
TAR_FILE="${DIR}/${BASENAME%.log}.tar.gz"
# 执行压缩并删除原文件
tar -czvf "$TAR_FILE" "$LOG_FILE" && rm "$LOG_FILE"
# 检查命令是否成功执行
if [ $? -eq 0 ]; then
echo "File $LOG_FILE compressed and deleted successfully."
else
echo "Failed to compress and delete file $LOG_FILE."
fi
done
3.2 cleanLog.sh
对今天的日志进行压缩
#!/bin/bash
# 指定目录
log_dir="/home/demo/logs"
# 获取当前日期,格式为 yyyy-MM-dd
current_date=$(date +"%Y-%m-%d")
# 拼接当前日期目录的路径
current_date_dir="${log_dir}/${current_date}"
# 检查目录是否存在
if [ -d "${current_date_dir}" ]; then
# 切换到指定日期目录
cd "${current_date_dir}" || exit 1
# 查找 .log 文件并进行压缩,排除创建日期最新的一个 .log 文件
find . -type f -name "*.log" -mmin +120 -exec ls -t {} + | while read -r log_file; do
# 获取文件名(不包含扩展名)
base_name=$(basename "${log_file}" .log)
# 获取文件的修改时间,格式为 HHMM
modification_time=$(stat -c %y "${log_file}" | cut -d ' ' -f 2 | cut -d ':' -f 1,2 | tr ':' '.')
# 压缩文件
tar -czvf "${base_name}.${modification_time}.tar.gz" "${log_file}"
echo "压缩完成:${base_name}.${modification_time}.tar.gz"
# 删除已压缩的日志文件
rm "${log_file}"
echo "已删除:${log_file}"
done
else
echo "目录不存在:${current_date_dir}"
fi
3.3 auto-delete-7-days-ago-log.sh
删除掉7天以前的日志
#!/bin/sh
find /home/demo/logs -name "*" -mtime +7 -type d -exec rm -rf {} +;
4.crontab配置
4.1 root用户
sudo su root
4.2 编辑定时器
# 编辑定时器
crontab -e
# 添加以下命令
0 */1 * * * /home/demo/sbin/cleanLog.sh > /home/iotuser/sbin/cleanLog.log 2>&1
0 0 * * * /home/demo/sbin/auto-delete-7-days-ago-log.sh > /home/iotuser/sbin/auto_delete.log 2>&1
30 0 * * * /home/demo/sbin/cleanYesterdayLog.sh > /home/iotuser/sbin/cleanYesterdayLog.log 2>&1
4.3 查看定时器
[root@iZuf66lb4ux3z43gzhrbcgZ sbin]# crontab -l
0 */1 * * * /home/demo/sbin/cleanLog.sh > /home/demo/sbin/cleanLog.log 2>&1
0 0 * * * /home/demo/sbin/auto-delete-7-days-ago-log.sh > /home/demo/sbin/auto_delete.log 2>&1
30 0 * * * /home/demo/sbin/cleanYesterdayLog.sh > /home/demo/sbin/cleanYesterdayLog.log 2>&1
4.4 加载重启定时器
/sbin/service crond reload
/sbin/service crond restart
/sbin/service crond status