原文出自這裡
要求是要每個月的第一個星期一執行指令.
先看看第一種解法.(由netman 提出)
crontab每天執行, 在 command 內判斷
test $(date +%e) = $(cal -m | awk '{if(NF==7)print $0}' | sed '2!d' | awk '{print $1}') || exit
上面的天書, 要分成兩部分來看.
第一部分比較簡單, 就是$(date +%e), 這個意思是取得今天是這個月幾號(第幾天).
第二部分比較複雜, $(cal -m | awk '{if(NF==7)print $0}' | sed '2!d' | awk '{print $1}')
其中 cal -m 是指印出以Monday為第一行的本月日曆,
Mo Tu We Th Fr Sa Su
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
.........
awk '{if(NF==7)print $0}' 則是過濾掉一行之中不是七個字串的部分,
執行完的結果如下
Mo Tu We Th Fr Sa Su
4 5 6 7 8 9 10
11 12 13 14 15 16 17
......
接下來的 sed '2!d' 意思是取出第二行, (捨去Mo Tu 這一行還有第三行之後)
最後的 awk '{print $1}' 則是印出第一個字串.
第二部分說穿了就是利用 cal 的輸出結果, 一步一步取得第一個星期一是這個月幾號.
再跟第一部份的今天幾號相比, 不相等的話就離開.
這個解法不夠漂亮的地方在於 cal 有 -m 選項可以用Monday當第一列,
萬一老闆要求是每個月第一個星期三,
第二部分的 awk '{if(NF==7)print $0}' 過濾條件就很難寫了.
不過這種寫法還是值得稱許, 畢竟能活用幾個tools也算是功夫了得!
第二種(TyroneYeh)解法, 簡單明瞭!
15 8 1-7 * 1 command (要先 crontab -e)
ps: 分 時 日 月 星期 要執行的指令
但........卻是不正確的.
求助男人(man crontab)的結果, 得到下面的例子
Note: The day of a command's execution can be specified by two fields
-- day of month, and day of week. If both fields are restricted (ie,
aren't *), the command will be run when eitherfield matches the cur-
rent time. For example,
``30 4 1,15 * 5'' would cause a command to be run at 4:30 am on the 1st
and 15th of each month, plus every Friday.
看起第一種解法可行,
要不然就是設定成每周一都執行, 再檢查日期是不是1~7
15 8 * * 1 command (crontab -e)
TODAY= $(date +%e)
if[ "$TODAY" == "1" || "$TODAY" == "2" || "$TODAY" == "3" || "$TODAY" == "4" || "$TODAY" == "5" || "$TODAY" == "6" || "$TODAY" == "7"]; then
## do something here
else
exit
fi
留言列表