最近公司的一個網站要在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 號分別進行,如此一來與你當初的規劃就不一樣了~所以囉,得要注意這個地方!
不經一事不長一智,還好這次的問題及時被發現,同事趕緊把檔案再更新掉,我也把這次的經驗好好記錄下來,以免日後又不小心犯了這個錯誤。