我正在设置我的 Debian 服务器,以使用 crontab、mysqldump 实用程序和 gunzip 备份我的数据库。
由于某种原因,我的 crontab 行似乎失败了,尤其是关键的一行:
15 2 * * * /usr/bin/mysqldump --user=root --password=XXX --all-databases | /bin/gzip > /backup/database_`date '+%d-%m-%Y'`.sql.gz
我已经阅读了几个关于这种行为的可能起源的主题,但我仍然不明白为什么这个 crontab 作业在我执行以下操作后仍然无法创建文件的原因:
- 使用root权限:我用它
sudo crontab -e
来编辑root crontab。 - 使用 whereis 查找我正在使用的命令的完整路径,例如用
mysqldump
替换/usr/bin/mysqldump
。 - 检查整行是否在 root 下工作:它确实创建了一个带有今天日期的档案,其中填充了 mysqldump 结果(显示警告,因为我在 CLI 中使用了密码,但我不认为这会导致 crontab 出现任何问题,对吗?)
我认为我在 crontab 中配置此行的方式有问题,但我看不到它。
显然,crontab 运行正常,因为当我附加该行时,* * * * * env > /backup/env.txt
我确实得到了一个包含 /backup 文件夹中的 env 内容的文件......
有人对此有线索吗?
谢谢 !
~斯蒂芬
答案1
cron的默认路径是:
PATH=/usr/bin:/usr/sbin:.
该date
实用程序位于,/bin/
因此您需要:
明确地将此目录添加到
PATH
forcron
PATH=/bin/:/usr/bin:/usr/sbin:. 15 2 * * * mysqldump --user=root --password=XXX --all-databases | gzip > /backup/database_$(date '+%d-%m-%Y').sql.gz
或者
提供命令的完整路径
date
:15 2 * * * /usr/bin/mysqldump --user=root --password=XXX --all-databases | /bin/gzip > /backup/database_$(/bin/date '+%d-%m-%Y').sql.gz
我更喜欢第一个选项,因为第二种方法很容易出错并忘记提供所有命令的完整路径(例如date
在您的问题中)。
答案2
好的,我发现什么对我来说不起作用:
通过跟踪/var/log/syslog
,我发现 crontab 有行大小限制!因此,当读取该行时,它会停在那里:... $(date +'
使得该行在执行时出现“错误”。
我的解决方案是将作业移至 /root/backup.sh 脚本并使用以下命令编辑 crontab:
15 2 * * * /root/backup.sh
至少,现在我可以备份我的数据了!!
我希望这个解决方案能够帮助其他人;)