天天看點

如何利用crond實作秒級定時任務?

1.問題引出:crond實作定時任務的思路

    crond服務預設情況每分鐘檢查系統中是否有需要執行的定時任務,如果有,就會根據事先定義好的規則來執行這個定時任務,而crond配置的書寫文法中:“* * * * * command”,最低的時間機關是分鐘,是以說,一個crond定時任務最多隻能執行分鐘級的定時任務,這是顯然的!但事實情況是,利用crond也是可以實作秒級的定時任務的,既然一個定時任務真的就隻能實作分鐘級的定時任務,那我幾個定時任務同時實作一個功能,是否有可能達到秒級???

2.實際案例:利用crond實作每二十秒的定時任務

請先看下面的定時任務書寫:

1

2

3

<code>* * * * * /bin/echo </code><code>"Hello"</code> <code>&gt;&gt; /server/scripts/hello.log</code>

<code>* * * * * sleep </code><code>20</code><code>;/bin/echo </code><code>"Hello"</code> <code>&gt;&gt; /server/scripts/hello.log</code>

<code>* * * * * sleep </code><code>40</code><code>;/bin/echo </code><code>"Hello"</code> <code>&gt;&gt; /server/scripts/hello.log</code>

看了上面的三條語句,懂思路的人相信已經知道如何利用crond來實作秒級的定時任務。上面這三條語句大緻相同,無非就是想做下面的一件事:

<code>/bin/echo </code><code>"Hello"</code> <code>&gt;&gt; /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,如需轉載請自行聯系原作者