1. 程式人生 > >crontab的兩大坑:百分號和環境變量

crontab的兩大坑:百分號和環境變量

crontab的兩大坑:百分號和環境變量

今天想給服務器加個自動備份mysql數據庫的功能(別怪我這麽久才加,阿裏雲每天全盤備份的,不怕丟數據庫),本以為只要5分鐘就能搞定的,結果入了兩個大坑。

我的crontab是這樣寫的:

 * * * mysqldump -u user -pxxxx database > "/alidata/backup/imyzf.com/$(date +%F\ %T).sql"

首先,是百分號(%)。

在crontab -e中輸入的命令裏,第一個%會被認為是標準輸入的開始,接下來的%都會被認為是換行。所以在這裏原本只是格式化日期的%被當成了標準輸入,命令就出問題了。


解決%方案有:

1 前面加 \ 轉義符 \%

2 加單引號 ‘date %F‘

3 把命令寫到腳本裏

我采用了把命令寫到了sh文件裏(為什麽?因為還有一個大坑)。

然後,是環境變量。

即使解決了上面的問題,還是不能正常執行任務,因為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

.... 腳本正文

crontab的兩大坑:百分號和環境變量