close

原文出自這裡

要求是要每個月的第一個星期一執行指令.

先看看第一種解法.(由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

arrow
arrow
    全站熱搜

    Orion 發表在 痞客邦 留言(1) 人氣()