iT邦幫忙

1

crontab未執行的原因?

最近發現備份資料庫的排程斷了 可是手動執行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)

看起來是有執行 可是還是沒輸出檔案
不知道錯誤原因

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
James
iT邦大師 6 級 ‧ 2017-06-05 12:32:49
最佳解答

35 11 * * * /root/backup-db.sh > /dev/null 2 >$1

crontab會將程式執行輸出mail到user信箱,系統沒有設定MTA就會出錯,可以將輸出重導到/dev/null避免,或安裝mta。

看更多先前的回應...收起先前的回應...
hsiang11 iT邦好手 1 級 ‧ 2017-06-05 12:59:37 檢舉

我有加過後面的測試還是沒輸出檔案

James iT邦大師 6 級 ‧ 2017-06-05 13:51:33 檢舉

有可能你的備份指令會輸出到/dev/stdin這樣就會被導到/dev/null
mysql dump | gzip -c > test.gz 這樣不行
mysql dump > test.sql && gzip test.sql 這樣可以

hsiang11 iT邦好手 1 級 ‧ 2017-06-05 13:53:59 檢舉

看起來時間到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)

hsiang11 iT邦好手 1 級 ‧ 2017-06-05 14:10:53 檢舉

backup-db.sh這檔案應該沒問題,因為從3月更改過就沒再變動
但是這兩天才沒輸出檔案
就算有多加 > /dev/null 2 >$1
還是會跳出No MTA installed錯誤
只有手動執行會輸出資料庫檔案 不知是不是最近系統更新出了bug

weiclin iT邦高手 4 級 ‧ 2017-06-05 16:09:49 檢舉

/root/backup-db.sh > /tmp/cron.log

後面加上 2>&1 才能看到錯誤訊息喔

hsiang11 iT邦好手 1 級 ‧ 2017-06-05 16:55:42 檢舉

cat /tmp/cron.log
/bin/sh: 1: root: not found

甚至還有出現過
/bin/sh: 1: /root/backup-db.sh: Permission denied

照理說執行的權限已經是root了 怪

hsiang11 iT邦好手 1 級 ‧ 2017-06-05 17:04:16 檢舉

-rw------- 失敗的script
其他台sh的權限
-rwxr-xr-x

看來快抓到問題核心了

James iT邦大師 6 級 ‧ 2017-06-05 17:30:23 檢舉

/bin/sh: 1: root: not found
這個錯誤很怪,它表示root被當作指令執行,很可能crontab的格式有問題。

hsiang11 iT邦好手 1 級 ‧ 2017-06-05 17:44:46 檢舉

最後使用*/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就變指令了

成功解決!!謝謝前面各位高人的協助
感謝你們

weiclin iT邦高手 4 級 ‧ 2017-06-05 17:48:41 檢舉

crontab 有兩種, 系統用的(/etc/crontab)可以加上要執行的帳號, 個別用戶的(crontab -e)無法指定帳號, 或許是這個原因?

hsiang11 iT邦好手 1 級 ‧ 2017-06-05 18:08:40 檢舉

weiclin 沒錯 沒想到會有這樣的差異
只不過-rw-------這樣的權限為何可以手動執行這部分就想不通了
crontab照理說需要X的權限
只好按照以前的751權限執行
會出這問題應該是覺得檔案裡有資料庫密碼 覺得不安全就設600
結果就包了XD

0
混水摸魚
iT邦研究生 2 級 ‧ 2017-06-05 17:53:35

感覺得權限問題
你執行 crontab -e 排程指令有先切到root權限嗎?

我要發表回答

立即登入回答