linux中用crontab定期清理系统缓存需满足四要素:1.必须用root权限执行(sudo crontab -e);2.脚本须用绝对路径、显式解释器(如#!/bin/bash)和完整命令路径;3.区分清内核缓存(sync+echo 3>/proc/sys/vm/drop_caches)与磁盘临时文件(find -mtime);4.加日志重定向和锁机制防并发误删。

Linux 中用 crontab 定期清理系统临时缓存,核心不是“随便写个定时任务”,而是权限、路径、环境、安全逻辑四者齐备。普通用户 crontab 无法清理 /tmp、/var/cache 等系统目录,脚本不带绝对路径或没声明解释器会静默失败,直接 echo 3 > /proc/sys/vm/drop_caches 这类操作还必须是 root 且需配合 sync。下面分四块说清楚。
必须用 root 权限编辑定时任务
清理系统级缓存(如 /tmp、/var/cache、/proc/sys/vm/drop_caches)必须由 root 执行。普通用户运行 crontab -e 编辑的是自己的任务,没有权限删系统文件,脚本会失败但不报错。
- 正确做法:运行 sudo crontab -e,在打开的编辑器中添加任务行
- 错误示范:crontab -e 后写 0 3 * * * /usr/local/bin/clean.sh —— 即使脚本存在,也因非 root 权限而失败
- 别在 crontab 行里加 sudo:0 3 * * * sudo /bin/sh /path/to/script.sh 无效,cron 不支持交互式密码输入,直接卡住或退出
脚本要绝对路径 + 显式解释器 + 环境隔离
cron 默认用 /bin/sh 执行,PATH 极窄(通常只有 /usr/bin:/bin),找不到 python3、jq、date -d 等命令;脚本里写 find 或 rm 不加路径,大概率报 command not found。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 脚本第一行必须是 #!/bin/bash 或 #!/usr/bin/env bash
- 所有命令用绝对路径:/usr/bin/find、/bin/rm、/bin/sync、/usr/bin/date
- crontab 中显式调用解释器:例如 0 3 * * * /bin/bash /usr/local/bin/drop_cache.sh
- 测试前先模拟 cron 环境:env -i /bin/bash --noprofile --norc /usr/local/bin/drop_cache.sh,能提前暴露路径和变量问题
清理缓存的两种典型场景与写法
一类是清内核缓存(buff/cache),另一类是清磁盘临时文件(/tmp、包管理缓存等),策略不同,不能混用。
-
清内核 pagecache/dentries/inodes(适用于内存被缓存占满、NIFI/Java 应用长期运行后 buff/cache 不释放):
脚本中写三行:
/bin/sync
/bin/sleep 2
/bin/echo 3 > /proc/sys/vm/drop_caches
注意:echo 必须用 /bin/echo,重定向必须用绝对路径设备节点 -
清磁盘临时文件(如 /tmp 下过期文件、apt/yum/pip 缓存):
推荐用 find + -mtime,避免依赖文件名:
/usr/bin/find /tmp -type f -mtime +7 -delete
/usr/bin/find /var/cache/apt/archives -name "*.deb" -mtime +3 -delete
调试阶段先用 -print 替代 -delete,确认目标无误再执行
加日志和基础防护,避免静默失败或并发冲突
没日志=看不见失败;没锁机制=两个清理任务同时跑,可能删掉正在写入的临时文件或中断服务。
- 每条 crontab 行末尾加上日志重定向:
0 3 * * * /bin/bash /usr/local/bin/drop_cache.sh >> /var/log/clean_cache.log 2>&1 - 脚本开头加简单锁判断(防止同一脚本重复触发):
LOCKFILE="/tmp/clean_cache.lock"
[ -f "$LOCKFILE" ] && exit 0
touch "$LOCKFILE"
trap 'rm -f $LOCKFILE' EXIT - 限定作用范围,防误删:
加 -maxdepth 1 防止递归进子目录;
加 -type f 只处理文件,不碰目录或设备节点










