1.問題引出:crond實作定時任務的思路
crond服務預設情況每分鐘檢查系統中是否有需要執行的定時任務,如果有,就會根據事先定義好的規則來執行這個定時任務,而crond配置的書寫文法中:“* * * * * command”,最低的時間機關是分鐘,是以說,一個crond定時任務最多隻能執行分鐘級的定時任務,這是顯然的!但事實情況是,利用crond也是可以實作秒級的定時任務的,既然一個定時任務真的就隻能實作分鐘級的定時任務,那我幾個定時任務同時實作一個功能,是否有可能達到秒級???
2.實際案例:利用crond實作每二十秒的定時任務
請先看下面的定時任務書寫:
1
2
3
<code>* * * * * /bin/echo </code><code>"Hello"</code> <code>>> /server/scripts/hello.log</code>
<code>* * * * * sleep </code><code>20</code><code>;/bin/echo </code><code>"Hello"</code> <code>>> /server/scripts/hello.log</code>
<code>* * * * * sleep </code><code>40</code><code>;/bin/echo </code><code>"Hello"</code> <code>>> /server/scripts/hello.log</code>
看了上面的三條語句,懂思路的人相信已經知道如何利用crond來實作秒級的定時任務。上面這三條語句大緻相同,無非就是想做下面的一件事:
<code>/bin/echo </code><code>"Hello"</code> <code>>> /server/scripts/hello.log</code>
即實際上,三條語句(其實準确點說是三個定時任務)的最終目的是一樣的,至于為何它就能實作每20秒一次的定時任務,請看下面的分析:
a.crond服務每分鐘檢查系統中的定時任務
b.計時開始,三個定時任務同時執行:
執行第一個定時任務時,便輸出資料到hello.log;
執行第二個定時任務時,先休息20秒(sleep 20),再準備該定時任務下一個指令的執行;
執行第三個定時任務時,先休息40秒(sleep 40),再準備該定時任務下一個指令的執行;
b.過了20秒後,第二個定時任務便執行第二個指令,也是輸出資料到hello.log;此時第三個定時任務還有20秒就執行第二個指令(已經sleep了20,還要再sleep20)
c.再過20秒,第三個定時任務便執行第二個指令,也是輸出資料到hello.log;
d.又過20秒,此時一分鐘已經過去了,crond服務又開始檢查系統中的定時任務
……
以此類推,當我們tail -f hello.log的方法追蹤hello.log中的資料變化時,可以看到每20秒就有一個hello輸出,即我們上面的方法就實作了每20秒的定時任務了。
3.如何用上面方法實作每秒級的定時任務?
實際可以發現,上面的方法隻是用變通的思路來實作秒級的定時任務,即多條crond語句+sleep,那如果想要實作每秒級的定時任務,想一下,按照這種思路去做,那是不是相當于下面這樣:
4
5
6
<code>* * * * * command</code>
<code>* * * * * sleep </code><code>1</code><code>;command</code>
<code>* * * * * sleep </code><code>2</code><code>;command</code>
<code>* * * * * sleep </code><code>3</code><code>;command</code>
<code>……</code>
<code>* * * * * sleep </code><code>59</code><code>;command</code>
實作一個功能就要寫60條crond語句!
是以沒有人會這樣去幹吧,這樣的效率也真是太低了!是以,雖然是可以實作每秒級的定時任務,但由于效率實在太低,也太麻煩了,如果真有這樣的需要,就得用其他方法替代了,比如寫shell腳本程式、借助第三方軟體實作等。
4.可以實作每幾十秒的定時任務
是以,用上面介紹的方法,其實要實作幾十秒每次的定時任務,也是比較簡單的,如果沒有太嚴格的要求,也可以考慮考慮的。
本文轉自 xpleaf 51CTO部落格,原文連結:http://blog.51cto.com/xpleaf/1682067,如需轉載請自行聯系原作者