用脚本实现定时清理聊天记录

wen 实用脚本 2

本文目录导读:

用脚本实现定时清理聊天记录

  1. Linux/Unix 环境下 (Shell脚本 + Crontab)
  2. Python 版本 (跨平台)
  3. Windows 版本 (PowerShell)
  4. Node.js 版本
  5. Docker 环境 (推荐)
  6. 使用方法
  7. 安全建议

我来为您提供几种不同环境下实现定时清理聊天记录的脚本方案。

Linux/Unix 环境下 (Shell脚本 + Crontab)

Shell 清理脚本

#!/bin/bash
# 聊天记录清理脚本
# 保存为:clean_chat_logs.sh
# 配置变量
LOG_DIR="/var/log/chat"  # 聊天记录目录
RETENTION_DAYS=7         # 保留天数
LOG_FILE="/var/log/chat_clean.log"  # 清理日志
# 记录开始时间
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始清理聊天记录" >> $LOG_FILE
# 清理超过指定天数的文件
find $LOG_DIR -name "*.log" -type f -mtime +$RETENTION_DAYS -delete 2>>$LOG_FILE
# 或者清理指定目录下的所有文件(谨慎使用)
# find $LOG_DIR -type f -mtime +$RETENTION_DAYS -delete
# 清理空目录
find $LOG_DIR -type d -empty -delete 2>>$LOG_FILE
# 记录结束时间
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 清理完成" >> $LOG_FILE
echo "---" >> $LOG_FILE
# 设置执行权限
# chmod +x clean_chat_logs.sh

添加到 Crontab 定时任务

# 编辑 crontab
crontab -e
# 添加以下行(每天凌晨2点执行)
0 2 * * * /path/to/clean_chat_logs.sh
# 或者每6小时执行一次
0 */6 * * * /path/to/clean_chat_logs.sh

Python 版本 (跨平台)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
聊天记录定时清理脚本
文件名:clean_chat_logs.py
"""
import os
import time
import logging
from datetime import datetime, timedelta
import schedule  # 需要安装: pip install schedule
# 配置
CHAT_DIR = "./chat_logs"  # 聊天记录目录
RETENTION_DAYS = 7        # 保留天数
LOG_FILE = "clean_log.txt"
# 设置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(message)s',
    handlers=[
        logging.FileHandler(LOG_FILE, encoding='utf-8'),
        logging.StreamHandler()
    ]
)
def clean_chat_logs():
    """清理过期聊天记录"""
    try:
        if not os.path.exists(CHAT_DIR):
            logging.warning(f"目录不存在: {CHAT_DIR}")
            return
        cutoff_date = datetime.now() - timedelta(days=RETENTION_DAYS)
        cleaned_count = 0
        for filename in os.listdir(CHAT_DIR):
            filepath = os.path.join(CHAT_DIR, filename)
            # 跳过目录
            if os.path.isdir(filepath):
                continue
            # 获取文件修改时间
            file_time = datetime.fromtimestamp(os.path.getmtime(filepath))
            # 删除过期文件
            if file_time < cutoff_date:
                os.remove(filepath)
                cleaned_count += 1
                logging.info(f"已删除: {filename}")
        logging.info(f"清理完成,共删除 {cleaned_count} 个文件")
    except Exception as e:
        logging.error(f"清理过程中出错: {e}")
def clean_by_file_count(max_files=100):
    """按文件数量清理(保留最新文件)"""
    try:
        files = []
        for filename in os.listdir(CHAT_DIR):
            filepath = os.path.join(CHAT_DIR, filename)
            if os.path.isfile(filepath):
                files.append((filepath, os.path.getmtime(filepath)))
        # 按修改时间排序
        files.sort(key=lambda x: x[1], reverse=True)
        # 删除超出限制的文件
        if len(files) > max_files:
            for filepath, _ in files[max_files:]:
                os.remove(filepath)
                logging.info(f"按数量限制删除: {os.path.basename(filepath)}")
    except Exception as e:
        logging.error(f"按数量清理出错: {e}")
# 定时任务设置
def run_scheduled_tasks():
    """运行定时任务"""
    # 每天凌晨2点执行
    schedule.every().day.at("02:00").do(clean_chat_logs)
    # 每天凌晨3点执行按数量清理
    schedule.every().day.at("03:00").do(clean_by_file_count, max_files=100)
    # 或者每6小时执行一次
    # schedule.every(6).hours.do(clean_chat_logs)
    logging.info("定时清理任务已启动...")
    while True:
        schedule.run_pending()
        time.sleep(60)  # 每分钟检查一次
if __name__ == "__main__":
    # 立即执行一次
    clean_chat_logs()
    # 启动定时任务
    # run_scheduled_tasks()
    # 或者使用更简单的方式:Windows任务计划/Linux cron
    print("脚本配置完成")

Windows 版本 (PowerShell)

# 聊天记录清理脚本
# 文件名: Clean-ChatLogs.ps1
# 配置参数
$ChatLogPath = "C:\ChatLogs"
$RetentionDays = 7
$LogFile = "C:\Logs\chat_clean.log"
# 记录函数
Function Write-Log {
    param([string]$Message)
    $TimeStamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    "$TimeStamp - $Message" | Out-File -FilePath $LogFile -Append
}
# 清理函数
Function Clean-ChatLogs {
    try {
        # 获取过期文件
        $CutoffDate = (Get-Date).AddDays(-$RetentionDays)
        # 删除过期文件
        Get-ChildItem -Path $ChatLogPath -File | 
            Where-Object { $_.LastWriteTime -lt $CutoffDate } | 
            Remove-Item -Force
        # 删除空文件夹
        Get-ChildItem -Path $ChatLogPath -Directory | 
            Where-Object { (Get-ChildItem $_.FullName -File).Count -eq 0 } | 
            Remove-Item -Force
        Write-Log "清理完成"
    }
    catch {
        Write-Log "错误: $_"
    }
}
# 执行清理
Write-Log "开始清理"
Clean-ChatLogs
# 设置Windows任务计划程序示例命令:
# schtasks /create /tn "CleanChatLogs" /tr "powershell.exe -File C:\scripts\Clean-ChatLogs.ps1" /sc daily /st 02:00

Node.js 版本

// clean_chat.js
const fs = require('fs');
const path = require('path');
const schedule = require('node-schedule'); // 需要安装: npm install node-schedule
// 配置
const config = {
    chatDir: './chat_logs',
    retentionDays: 7,
    logFile: './clean_log.txt'
};
// 日志函数
function log(message) {
    const timestamp = new Date().toISOString();
    const logMessage = `${timestamp} - ${message}\n`;
    console.log(logMessage.trim());
    fs.appendFileSync(config.logFile, logMessage);
}
// 清理函数
async function cleanChatLogs() {
    try {
        if (!fs.existsSync(config.chatDir)) {
            log(`目录不存在: ${config.chatDir}`);
            return;
        }
        const files = fs.readdirSync(config.chatDir);
        const cutoffDate = new Date();
        cutoffDate.setDate(cutoffDate.getDate() - config.retentionDays);
        let cleanedCount = 0;
        files.forEach(filename => {
            const filepath = path.join(config.chatDir, filename);
            const stats = fs.statSync(filepath);
            if (stats.isFile() && stats.mtime < cutoffDate) {
                fs.unlinkSync(filepath);
                cleanedCount++;
                log(`已删除: ${filename}`);
            }
        });
        log(`清理完成,共删除 ${cleanedCount} 个文件`);
    } catch (error) {
        log(`错误: ${error.message}`);
    }
}
// 定时任务设置
function setupSchedule() {
    // 每天凌晨2点执行
    schedule.scheduleJob('0 2 * * *', () => {
        log('定时清理任务开始');
        cleanChatLogs();
    });
    log('定时任务已设置');
}
// 立即执行一次
cleanChatLogs();
// 启动定时任务
// setupSchedule();
// 或者使用setInterval(简单定时)
// setInterval(cleanChatLogs, 6 * 60 * 60 * 1000); // 每6小时
module.exports = { cleanChatLogs, setupSchedule };

Docker 环境 (推荐)

# Dockerfile
FROM alpine:latest
RUN apk add --no-cache bash
COPY clean_chat.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/clean_chat.sh
# 安装cron
RUN apk add --no-cache dcron
# 添加定时任务
RUN echo "0 2 * * * /usr/local/bin/clean_chat.sh" >> /var/spool/cron/crontabs/root
# 启动crond
CMD ["crond", "-f", "-l", "2"]

使用方法

Linux/Mac:

# 直接执行
./clean_chat_logs.sh
# 添加到crontab
crontab -e
0 2 * * * /path/to/clean_chat_logs.sh

Windows:

# 执行PowerShell脚本
.\Clean-ChatLogs.ps1
# 通过任务计划程序设置定时

Docker:

# 构建镜像
docker build -t chat-cleaner .
# 运行容器
docker run -d --name chat-cleaner \
  -v /path/to/chat/logs:/var/log/chat \
  chat-cleaner

安全建议

  1. 先测试再正式使用
  2. 保留备份:首次使用前备份聊天记录
  3. 设置日志:记录清理操作以便审计
  4. 权限控制:确保脚本只有必要的权限
  5. 正则匹配:如果需要清理特定格式文件

请根据您的具体环境和需求选择合适的脚本,并确保在测试环境中充分测试后再部署到生产环境。

抱歉,评论功能暂时关闭!