必须用绝对路径调用命令,因crontab中path极简,tar、find、date等命令不写全路径会报“command not found”;需用which查真实路径并硬编码,如/bin/tar、/usr/bin/find、/bin/date。

脚本必须用绝对路径调用命令
crontab 环境里 PATH 极其精简,tar、find、date 这些命令不写全路径就直接报 command not found。别依赖 shell 配置文件,也不靠 source ~/.bashrc —— cron 不读它。
- 查命令真实路径:运行
which tar、which find,结果通常是/bin/tar、/usr/bin/find - 脚本里全部硬编码:比如写
/bin/tar -czf ...,而不是只写tar -czf ... - 连
date也要写/bin/date,避免某些最小化系统里/usr/bin/date缺失
时间戳命名要防覆盖且可排序
用 $(date +\%Y\%m\%d_\%H\%M) 是底线,但注意两点:一是 % 在 crontab 里要转义(写成 \%Y\%m\%d),二是分钟级精度才真正防冲突——同一分钟内两次执行会覆盖。
- 推荐格式:
backup_$(/bin/date +\%Y\%m\%d_\%H\%M).tar.gz - 别用
%S(秒):多数备份不需要秒级区分,反而让文件名过长、ls 排序混乱 - 命名含项目标识:比如
website_$(...).tar.gz或config_$(...).tar.gz,后续find清理时能精准匹配
自动清理旧备份不能只靠 mtime
find ... -mtime +7 -delete 看似简单,但 -mtime 按“24 小时整数倍”计算,不是按日历日。比如某备份是 7 月 2 日 23:59 生成,到 7 月 9 日 00:01 就被判定为“超过 7 天”,提前删掉。
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- 更稳妥的做法:用
find ... -name "backup_*.tar.gz" -printf '%T@ %p\0' | sort -znr | tail -z -n +8 | xargs -0 -r rm—— 按文件修改时间戳精确排序,留最新 7 个 - 或者保守点:把
-mtime +7改成-mtime +8,多留一天缓冲 - 清理前先测试:把
-delete换成-print,确认列出的确实是该删的文件
crontab 条目必须显式声明环境变量
即使脚本开头写了 PATH=...,cron 仍可能在执行前就因找不到 sh 解释器而失败。最保险的方式是在 crontab 行里直接声明。
- 编辑任务:
crontab -e - 正确写法:
PATH=/usr/local/bin:/usr/bin:/bin HOME=/home/youruser 0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1 - 别漏
HOME:某些工具(如gpg)依赖它找密钥环;sudo也可能因 HOME 不对拒绝执行 - 日志重定向必须加:
>> /var/log/backup.log 2>&1,否则失败无声,你啥也不知道
实际跑起来前,手动执行一次 /usr/local/bin/backup.sh,看文件是否生成、日志是否写入、tar -tzf 能否列出内容——这步跳过,后面所有定时都是幻觉。










