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

2021-09-20 19:19:26 字數 1261 閱讀 6648

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

我的crontab是這樣寫的:

* * * mysqldump -u user -p***x database > "/alidata/backup/imyzf.com/$(date +%f\ %t).sql"
首先,是百分號(%)。

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

解決%方案有:

1 前面加 \ 轉義符  \%

2 加單引號   'date %f'

3 把命令寫到指令碼裡

我採用了把命令寫到了s**件裡(為什麼?因為還有乙個大坑)。

然後,是環境變數。

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

所以要修改預設設定,或者簡單點,在s**件裡另外加上一行修改path,最後成了這樣:

#!/bin/bashpath="$path:/alidata/server/mysql/bin"mysqldump -u user -p***x 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

.... 指令碼正文

Shell中變數的單百分號 和雙百分號 的作用

使用百分號將變數的內容從變數的後面刪除,並從變數的尾部刪除。不同的是,乙個 號表示從尾部最近的匹配刪除,兩個 從尾部最遠的匹配刪除。同時支援使用萬用字元。比如 先宣告乙個變數 filename aaabbccddaabbccdd使用乙個百分號擷取尾部bb echo 結果 aaabbccddaa可以看...

特殊用法 百分號 井號

為了完整起見,我這裡再用一些例子加以說明 的一些特異功能 假設我們定義了乙個變數為 file dir1 dir2 dir3 my.file.txt 我們可以用 分別替換獲得不同的值 拿掉第一條 及其左邊的字串 dir1 dir2 dir3 my.file.txt 拿掉最後一條 及其左邊的字串 my....

MySQL求百分比帶百分號

round concat 推薦 concat round a.price b.price b.price 100,2 concat round a.price b.price b.price 100,3 a.price b.price b.price 0.234467 23.45 a.price b...