crontab脚本需显式设置path等环境变量并用绝对路径调用命令。应在脚本首行后立即export path,添加必要路径如/usr/local/mysql/bin;所有命令(mysqldump、tar等)须写全路径;开头cd到工作目录并用绝对路径;重定向stderr至日志文件以便排查。

crontab 默认环境极简,PATH 往往只有 /usr/bin:/bin,很多命令(如 mysqldump、rsync、date)找不到,脚本就静默失败。这不是脚本写错了,而是“跑不起来”。关键不是加权限,而是让 cron 知道去哪儿找命令。
在脚本开头显式声明 PATH 和其他必要变量
不要依赖系统默认环境。在备份脚本第一行 #!/bin/bash 后立即设置:
- PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/mysql/bin" —— 把常用命令路径全列出来,尤其 MySQL 相关工具要包含
- export PATH —— 必须导出,否则只在当前 shell 生效
- 如需中文时间戳或特殊 locale,可加:LANG=en_US.UTF-8 或 LC_ALL=C
所有命令都用绝对路径
即使设置了 PATH,也建议直接写全路径,避免歧义和版本冲突:
- 不用
mysqldump,改用/usr/bin/mysqldump - 不用
tar,改用/bin/tar - 不用
date,改用/bin/date - 压缩用
/bin/gzip,清理用/usr/bin/find
明确工作目录,避免路径错误
crontab 执行时的当前目录通常是用户家目录(如 /root 或 /home/user),但你的脚本可能依赖相对路径。务必在脚本开头加:
- cd /backup || exit 1 —— 切到目标目录再操作,失败则退出
- 所有输入输出路径(如
/home/user/docs、/backup/db_$(date ...).sql)统一用绝对路径
重定向 stderr 并记录日志
环境问题导致的失败往往没有输出,必须捕获错误才能排查:
- 在 crontab 条目末尾加上:>> /var/log/backup.log 2>&1
- 或在脚本内用
exec >> /var/log/backup.log 2>&1统一重定向所有输出 - 日志文件提前创建并赋权:
touch /var/log/backup.log && chmod 644 /var/log/backup.log











