手动正常的Bash数据库备份脚本Crontab执行时清理逻辑失效
路径与命令绝对化问题:Crontab的默认
PATH比交互式登录时窄很多,脚本里如果用了相对路径(比如./backups)或者未指定绝对路径的命令(比如find),可能导致找不到目标文件或无法执行命令。检查清理逻辑中的路径,全部替换为绝对路径(比如/home/debian/script/backups),命令也要写全路径(比如/usr/bin/find)。工作目录不一致:即便crontab里写了
cd /home/debian/script,脚本内部若仍依赖相对路径,还是可能出问题。比如脚本清理部分写的rm backups/*.sql,换成绝对路径rm /home/debian/script/backups/*.sql再测试。权限不足:非root用户的crontab执行时,环境权限比交互式登录更严格。手动执行时你可能继承了额外的组权限,但crontab是纯净环境。检查备份目录
/home/debian/script/backups的权限,确保执行脚本的用户拥有写权限(删除文件需要写权限)。find命令时间判断偏差:如果清理用了find -mtime +7,注意-mtime默认是按24小时周期计算,若脚本执行时间和文件修改时间的时区、周期不匹配,会导致判断错误。可以加-daystart参数,让时间判断从当天零点开始:/usr/bin/find /home/debian/script/backups -type f -mtime +7 -daystart -delete查看执行日志定位错误:在crontab里添加日志输出,把脚本执行的所有输出(包括错误)写到文件里:
cd /home/debian/script && sh save_db.sh > /home/debian/script/backup_cron.log 2>&1执行后查看日志,里面会直接显示清理逻辑失败的具体原因(比如命令不存在、权限拒绝、路径找不到等)。
Shell兼容性问题:Debian默认
sh指向dash,如果脚本开头是#!/bin/bash但用sh执行,可能因为bash特有的语法(比如数组、扩展变量)导致部分逻辑失效。把crontab里的sh save_db.sh改成bash save_db.sh,或者调整脚本兼容dash。
内容的提问来源于stack exchange,提问作者antomaa12

