LOADING...

加载中请稍等...

loading

本教程提供了基于 Systemd 的 Linux 内存缓存自动清理方案。通过 Shell 脚本和 Systemd Timer 实现定时、安全的缓存清理,并包含可用内存阈值检查和完整的日志监控配置。

🛡️ Linux 自动内存缓存清理方案 (Systemd 版本)

📂 1. 创建缓存清理脚本

创建脚本文件:

sudo vim /usr/local/bin/cache_cleaner.sh

脚本内容

#!/bin/bash
# 内存缓存清理脚本 v1.2
# 安全模式:当可用内存 >20% 时不执行清理

MIN_FREE_PERCENT=20  # 触发清理的阈值

echo "[$(date +'%F %T')] 检查内存状态..."

# 获取内存信息(total, used)
read -r total used _ <<< $(free -m | awk '/Mem:/{print $2,$3}')
# 计算当前"可用率"(使用 available 字段更准确)
free_percent=$(( (total - used) * 100 / total ))

if [ "$free_percent" -lt "$MIN_FREE_PERCENT" ]; then
    echo "内存可用率 ${free_percent}% < ${MIN_FREE_PERCENT}%,执行清理..."

    # 安全清理步骤
    sync
    echo 1 > /proc/sys/vm/drop_caches
    sleep 1
    echo 2 > /proc/sys/vm/drop_caches
    sleep 1
    echo 3 > /proc/sys/vm/drop_caches

    # 使用 available 字段计算最新可用百分比(更准确)
    new_free=$(free -m | awk '/Mem:/{printf "%.1f", $7/$2*100}')
    echo "清理完成 → 当前可用: ${new_free}%"
else
    echo "内存充足 (${free_percent}%),跳过清理"
fi

设置脚本权限

sudo chmod 755 /usr/local/bin/cache_cleaner.sh
sudo chown root:root /usr/local/bin/cache_cleaner.sh

⚙️ 2. 配置 Systemd 服务单元

创建服务文件:

sudo vim /etc/systemd/system/cache_cleaner.service

服务配置内容

[Unit]
Description=Memory Cache Cleaner
After=syslog.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/cache_cleaner.sh
User=root
ProtectSystem=full

🕒 3. 创建 Systemd 定时器

创建定时器文件:

sudo vim /etc/systemd/system/cache_cleaner.timer

定时器配置内容

[Unit]
Description=Run memory cleaner every 3 hours

[Timer]
OnCalendar=*-*-* 0/3:00:00
RandomizedDelaySec=300
Persistent=true

[Install]
WantedBy=timers.target

🔧 4. 启用并测试服务

# 重载 systemd 配置
sudo systemctl daemon-reload

# 测试脚本
sudo /usr/local/bin/cache_cleaner.sh

# 启用定时器
sudo systemctl enable --now cache_cleaner.timer

# 验证状态
systemctl list-timers | grep cache_cleaner
journalctl -u cache_cleaner.service -f

📊 5. 监控与日志管理

命令目的 具体命令
查看最近记录 journalctl -u cache_cleaner.service -n 10
跟踪实时日志 journalctl -u cache_cleaner.service -f

配置每日日志导出(可选)

# 编辑 root 的 crontab
sudo crontab -e

# 添加以下内容:
0 0 * * * journalctl -u cache_cleaner.service --since "1 day ago" > /var/log/memclean_daily.log

📝 注意事项

  1. 脚本会在可用内存低于 20% 时触发清理
  2. 使用 sync 确保数据安全
  3. 通过 sleep 间隔确保清理操作平滑执行
  4. 可以根据实际需求调整定时器间隔
  5. 建议定期检查日志确保服务正常运行

关于我

全平台同名”汪多多是只猫”,专注分享实用开源工具,让你的数字生活更自由!

关注我,发现更多旧物改造的乐趣与技巧!


头像
汪多多是只猫
失业的运维工程师
热爱开源与分享
微信公众号