今天想給服務器加個自動備份mysql數據庫的功能(別怪我這麼久才加,阿里雲天天全盤備份的,不怕丟數據庫),本覺得只要5分鐘就能搞定的,結果入了兩個大坑。mysql
個人crontab是這樣寫的:sql
* * * mysqldump -u user -pxxxx database > "/alidata/backup/imyzf.com/$(date +%F\ %T).sql"
首先,是百分號(%)。數據庫
在crontab -e中輸入的命令裏,第一個%會被認爲是標準輸入的開始,接下來的%都會被認爲是換行。因此在這裏本來只是格式化日期的%被當成了標準輸入,命令就出問題了。bash
解決%方案有:服務器
1 前面加 \ 轉義符 \%ide
2 加單引號 'date %F'測試
3 把命令寫到腳本里阿里雲
我採用了把命令寫到了sh文件裏(爲何?由於還有一個大坑)。spa
而後,是環境變量。code
即便解決了上面的問題,仍是不能正常執行任務,由於crontab的環境變量是另外定義的。經過cat /etc/crontab
你會發現默認的PATH是/sbin:/bin:/usr/sbin:/usr/bin,而咱們的mysqldump是在/alidata/server/mysql/bin裏的。
注:/etc/crontab文件定義的系統cron環境變量,咱們本身定義的稱做用戶cron,我測試了一下/bin,/usr/bin下的命令能夠直接運行,而/sbin,/usr/sbin下的命令不能夠運行(只測試了2個:ifconfig fdisk)
因此要修改默認設置,或者簡單點,在sh文件裏另外加上一行修改PATH,最後成了這樣:
#!/bin/bashPATH="$PATH:/alidata/server/mysql/bin"mysqldump -u user -pxxxx database > "/alidata/backup/www.imyzf.com/$(date +%F\ %T).sql"
而後,個人crontab寫成了這樣(使用/dev/null是爲了丟棄mysqldump使用標準輸出的提示):
* * * /alidata/backup/www.imyzf.com/backup.sh > /dev/null 2>&1
好了,終於搞定了!
注:其實添加環境變量有更簡單的辦法,只要加上source /etc/profile便可(如bashrc .bash_profile等有特殊環境變量,多加幾個source便可)
#!/bin/bash
source /etc/profile
.... 腳本正文