練功房推薦書單

  • 猛虎出柙雙劍合璧版--最新 OCA / OCP Java SE 7 Programmer 專業認證 (電子書)
  • 流浪教師存零股存到3000萬(全新增修版)(書+DVD)
  • 開始在關西自助旅行(京都‧大阪‧神戶‧奈良)(全新增訂版)
  • 不敗教主的300張股票存股術

Linux的crontab中週與日月不可同時並存 RSS feed
討論區首頁 » Linux
發表人 內容
andowson

七段學員
[Avatar]

註冊時間: 2007/1/2
文章: 711
來自: 台北
離線
最近公司的一個網站要在6/19(一) 10:00才開放使用,同事請我在6/19 10:00時把網站目錄中的三個檔案置換過去,這樣子使用者就可以看到最後的頁面了。

這個可以手動做,也可以透過系統排程來自動執行。由於當天10:00到底會不會因為忙別的事而忘記換版實在很難說,故我採取由系統自動排程來執行這件工作,萬一系統排程沒執行好,再手動作一次。

於是我請同事先把三個檔案放在某個目錄下,然後我寫一支shell script來做copy的動作。假設這支shell script叫做deployfile.sh,內容大概就是這個樣子:

#!/bin/bash
cp -pf /home/user1/index.jsp /srv/webapps/www.mycompany.com/events/index.jsp
cp -pf /home/user1/message.pdf /srv/webapps/www.mycompany.com/events/message.pdf
cp -pf /home/user1/qa.pdf /srv/webapps/www.mycompany.com/events/qa.pdf


透過下列指令我將這個shell script設定為可執行
chmod +x /root/admin/deployfile.sh

接著我透過crontb -e方式設定這個排程,為了慎重起見,我特別加上最後的星期一選項,目的是希望這個排程就只會在6/19(一) 10:00只跑這一次

0 10 19 6 1 /root/admin/deployfile.sh > /tmp/deployfile.log 2>&1


然後我將deployfile.sh複製一份為deployfile_test.sh,將檔案要copy過去的目錄先換成/tmp, 實際透過cron排程跑一次,確認這個shell script的寫法是OK的。

6/19那天10:00多果然我忙到忘了要去手動copy檔案,經詢問同事確認檔案已經更新了,不過他有再手動改過內容,我想說這個排程有鎖定只有剛好是6/19的星期一才會執行,就沒去把它取消。

到了今天同事突然發現檔案內容怎麼又被覆寫回去舊版內容,這下可真是奇怪了,難道是那個排程又再跑一次嗎?經過檢查排程的輸出log檔/tmp/deployfile.log
發現檔案時間變成了6/26 10:00,確認應該是排程又在6/19的下個週一的10:00跑了一次
也就是說,當在crontab設定同時指定日期跟星期時,crontab是用or來處理,只要日期或星期符合都執行

根據鳥哥網站的說明
http://linux.vbird.org/linux_basic/0430cron.php

週與日月不可同時並存
另一個需要注意的地方在於:『你可以分別以週或者是日月為單位作為循環,但你不可使用「幾月幾號且為星期幾」的模式工作』。 這個意思是說,你不可以這樣編寫一個工作排程:
30 12 11 9 5 root echo "just test" <==這是錯誤的寫法
本來你以為九月十一號且為星期五才會進行這項工作,無奈的是,系統可能會判定每個星期五作一次,或每年的 9 月 11 號分別進行,如此一來與你當初的規劃就不一樣了~所以囉,得要注意這個地方!


不經一事不長一智,還好這次的問題及時被發現,同事趕緊把檔案再更新掉,我也把這次的經驗好好記錄下來,以免日後又不小心犯了這個錯誤。

分享經驗 累積智慧
[WWW]
cerrykoman

十級學員

註冊時間: 2020/7/16
文章: 1
來自: New Zealand
離線
I think that is nice sir
[WWW]
 
討論區首頁 » Linux
前往:   
行動版