开发工具

如何定时清空文件内容,定时记录文件大小?

以下是一个用于定时清空文件内容并记录文件大小的Shell脚本,结合 cron 定时任务实现自动化管理。脚本包含日志记录、文件大小监控和安全性检查功能:

脚本代码

#!/bin/bash
# 功能:定时清空文件内容并记录文件大小
# 用法:./file_cleaner.sh <目标文件路径> [日志文件路径]

# 参数设置
TARGET_FILE="${1:-/var/log/app/app.log}"  # 默认目标文件
LOG_FILE="${2:-/var/log/file_cleaner.log}" # 默认日志路径
MAX_LOG_SIZE=10240  # 日志最大大小(10KB),超过则清空

# 确保目标文件存在
if [ ! -f "$TARGET_FILE" ]; then
    echo "[错误] 文件不存在: $TARGET_FILE" >> "$LOG_FILE"
    exit 1
fi

# 记录初始大小
original_size=$(du -sh "$TARGET_FILE" | awk '{print $1}')
echo "===== 操作时间: $(date '+%Y-%m-%d %H:%M:%S') =====" >> "$LOG_FILE"
echo "原始大小: $original_size" >> "$LOG_FILE"

# 清空文件
truncate -s 0 "$TARGET_FILE"  # 推荐方法,保留文件属性
# 或者使用: > "$TARGET_FILE"

# 记录清空后大小
new_size=$(du -sh "$TARGET_FILE" | awk '{print $1}')
echo "清空后大小: $new_size" >> "$LOG_FILE"
echo "------------------------" >> "$LOG_FILE"

# 日志文件管理(防止过大)
current_log_size=$(du -b "$LOG_FILE" | awk '{print $1}')
if [ "$current_log_size" -gt "$MAX_LOG_SIZE" ]; then
    echo "[信息] 日志文件超过限制,执行轮转" > "$LOG_FILE"
fi


配置定时任务

1. 编辑crontab

crontab -e


2. 添加定时规则

# 每天凌晨3点执行,清空/var/log/app/app.log并记录到默认日志
0 3 * * * /root/file_cleaner.sh /var/log/app/app.log

# 每小时清空一次/tmp/data.log,并指定自定义日志路径
0 * * * * /root/file_cleaner.sh /tmp/data.log /var/log/custom_cleaner.log


3. 重载cron服务

systemctl reload cron  # 适用于systemd系统
# 或者
service cron reload     # 适用于SysVinit系统


使用示例

1. 手动运行测试

# 清空指定文件并记录日志
sudo ./file_cleaner.sh /var/log/nginx/access.log


2. 查看日志文件

tail -f /var/log/file_cleaner.log

输出示例:
===== 操作时间: 2023-10-05 14:30:22 =====
原始大小: 12M
清空后大小: 0K
------------------------



扩展功能

1. 多文件处理

修改脚本支持批量处理:

#!/bin/bash
FILES=("/var/log/app1.log" "/var/log/app2.log")
for file in "${FILES[@]}"; do
    /path/to/file_cleaner.sh "$file"
done


2. 邮件通知

清空后发送通知邮件(需配置邮件服务):

echo "文件 $TARGET_FILE 已清空,原大小: $original_size" | mail -s "文件清理通知" admin@example.com


3. 备份文件内容

清空前备份文件:

BACKUP_DIR="/var/log/backups"
cp "$TARGET_FILE" "$BACKUP_DIR/$(basename $TARGET_FILE)_$(date +%Y%m%d).bak"


注意事项

1、文件权限

确保脚本有权限操作目标文件和写入日志

系统日志文件(如 /var/log/messages)可能需要 sudo 权限


2、日志轮转

使用 logrotate 管理日志文件(替代脚本内手动轮转):

# 配置 /etc/logrotate.d/file_cleaner
/var/log/file_cleaner.log {
    daily
    rotate 7
    compress
    missingok
}


3、重要数据保护

避免清空数据库文件、配置文件等关键数据

生产环境建议先备份再清空


通过此脚本,您可以自动化管理日志文件大小,防止磁盘空间耗尽,同时保留操作记录以便审计。建议根据实际需求调整清空频率和文件路径。