我正在設定 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
至少,現在我可以備份我的資料了!
我希望這個解決方案能夠幫助其他人;)