最近發現備份資料庫的排程斷了 可是手動執行backup-db.sh還是有成功輸出檔案,抓不到排程為何失敗
做了一些測試
系統ubuntu 14
crontab -e加了一段35 11 * * * /root/backup-db.sh
查log發現
Jun 5 11:29:39 ip-172-30-2-162 cron[28891]: (CRON) INFO (pidfile fd = 3)
Jun 5 11:29:39 ip-172-30-2-162 cron[28892]: (CRON) STARTUP (fork ok)
Jun 5 11:29:39 ip-172-30-2-162 cron[28892]: (CRON) INFO (Skipping @reboot jobs
-- not system startup)
Jun 5 11:30:42 ip-172-30-2-162 crontab[28895]: (root) BEGIN EDIT (root)
Jun 5 11:31:14 ip-172-30-2-162 crontab[28895]: (root) REPLACE (root)
Jun 5 11:31:14 ip-172-30-2-162 crontab[28895]: (root) END EDIT (root)
Jun 5 11:32:01 ip-172-30-2-162 cron[28892]: (root) RELOAD (crontabs/root)
Jun 5 11:35:01 ip-172-30-2-162 CRON[28943]: (root) CMD (/root/backup-db.sh)
Jun 5 11:35:01 ip-172-30-2-162 CRON[28942]: (CRON) info (No MTA installed, disc
arding output)
看起來是有執行 可是還是沒輸出檔案
不知道錯誤原因
35 11 * * * /root/backup-db.sh > /dev/null 2 >$1
crontab會將程式執行輸出mail到user信箱,系統沒有設定MTA就會出錯,可以將輸出重導到/dev/null避免,或安裝mta。
我有加過後面的測試還是沒輸出檔案
有可能你的備份指令會輸出到/dev/stdin這樣就會被導到/dev/null
mysql dump | gzip -c > test.gz 這樣不行
mysql dump > test.sql && gzip test.sql 這樣可以
看起來時間到backup-db.sh是有被執行的
我把錯誤另外輸出到/tmp/cron.log
結果查log只有0K沒資料
無法理解為啥沒錯誤無法正確輸出備份檔案
Jun 5 13:45:01 ip-172-30-2-162 CRON[30327]: (root) CMD (/root/backup-db.sh > /
tmp/cron.log)
Jun 5 13:45:01 ip-172-30-2-162 CRON[30326]: (CRON) info (No MTA installed, disc
arding output)
backup-db.sh這檔案應該沒問題,因為從3月更改過就沒再變動
但是這兩天才沒輸出檔案
就算有多加 > /dev/null 2 >$1
還是會跳出No MTA installed錯誤
只有手動執行會輸出資料庫檔案 不知是不是最近系統更新出了bug
/root/backup-db.sh > /tmp/cron.log
後面加上 2>&1 才能看到錯誤訊息喔
cat /tmp/cron.log
/bin/sh: 1: root: not found
甚至還有出現過
/bin/sh: 1: /root/backup-db.sh: Permission denied
照理說執行的權限已經是root了 怪
-rw------- 失敗的script
其他台sh的權限
-rwxr-xr-x
看來快抓到問題核心了
/bin/sh: 1: root: not found
這個錯誤很怪,它表示root被當作指令執行,很可能crontab的格式有問題。
最後使用*/3 * * * * /root/backup-db.sh > /tmp/cron.log 2>&1
log也沒有錯誤 正確輸出檔案 看來一開始是檔案權限有修改忘了
crontab和cron.d觀念可能有些不同
我是照cron.d的排程 中間加root 應該代表root執行
*/3 * * * * root /root/backup-db.sh
想不到在crontab 加root就變指令了
成功解決!!謝謝前面各位高人的協助
感謝你們
crontab 有兩種, 系統用的(/etc/crontab)可以加上要執行的帳號, 個別用戶的(crontab -e)無法指定帳號, 或許是這個原因?
weiclin 沒錯 沒想到會有這樣的差異
只不過-rw-------這樣的權限為何可以手動執行這部分就想不通了
crontab照理說需要X的權限
只好按照以前的751權限執行
會出這問題應該是覺得檔案裡有資料庫密碼 覺得不安全就設600
結果就包了XD