天天看點

crontab計劃任務無法執行(小結)

最近在與朋友梳理運維中遇到的坑的時候,發現大家都遇見過crontab計劃任務沒法正常執行的情況,如是簡單的整理下,主要有如下幾種情況:

1、環境變量是否定義

說明:crontab執行shell時,隻能識别為數不多的環境變量,所有在腳本中最好使用export重新聲明下該變量

說明:shell腳本rman備份oracle,直接執行腳本中的指令,可以備份,但寫到腳本并放入crontab中,計劃任務就無法執行(後來在腳本中source環境變量),再次執行就OK了

2、腳本是否有可執行權限

說明:對于shell腳本,如果沒有可執行權限的話,最好能夠使用/bin/sh 腳本絕對路徑

3、crontab中無法執行php的解決方法

<code>*</code><code>/5</code> <code>* * * * </code><code>/usr/local/php/bin/php</code> <code>/shells/cron/delete_redis</code><code>.php &gt;</code><code>/dev/null</code> <code>2&gt;&amp;1</code>

<code>檢查發現,php并沒有正常執行,可能是因為php中沒配置絕對路徑</code>

<code>解決方法:</code>

<code>*</code><code>/5</code> <code>* * * * </code><code>cd</code> <code>/var/www/cron</code> <code>&amp;&amp; </code><code>/usr/local/php/bin/php</code> <code>/shells/cron/delete_redis</code><code>.php &gt;</code><code>/dev/null</code> <code>2&gt;&amp;1</code>

4、crontab下防止腳本運作沖突

CentOS6下(使用lockf或者flock):

<code>*</code><code>/10</code> <code>* * * *   (</code><code>/usr/bin/lockf</code>  <code>-s -t 0  </code><code>/tmp/test</code><code>.lock    </code><code>/usr/local/php/bin/php</code> <code>test</code><code>.php &gt;</code><code>/dev/null</code> <code>2&gt;&amp;1)</code>

<code>lockf下參數說明:</code>

<code>-k: 一直等待擷取檔案鎖</code>

<code>-s:不發出任何資訊,即使拿不到檔案鎖</code>

<code>-t seconds:設定timeout逾時時間是seconds秒,如果超過時間,則自動放棄</code>

CentOS7下(使用flock)

<code>*</code><code>/10</code> <code>* * * * root flock -xn </code><code>/tmp/mytest</code><code>.lock -c </code><code>'cd /var/www/cron &amp;&amp; /usr/local/php/bin/php /shells/cron/delete_redis.php'</code><code>&gt;</code><code>/dev/null</code> <code>2&gt;&amp;1</code>

<code>這樣當任務未執行完成,下一任務判斷到</code><code>/tmp/mytest</code><code>.lock被鎖定,則結束目前的任務,下一周期再判斷。</code>

<code>flock參數說明:</code>

<code>-s, --shared:    獲得一個共享鎖</code>

<code>-x, --exclusive: 獲得一個獨占鎖</code>

<code>-u, --unlock:    移除一個鎖,通常是不需要的,腳本執行完會自動丢棄鎖</code>

<code>-n, --nonblock:  如果沒有立即獲得鎖,直接失敗而不是等待</code>

<code>-w, --timeout:   如果沒有立即獲得鎖,等待指定時間</code>

<code>-o, --close:     在運作指令前關閉檔案的描述符号。用于如果指令産生子程序時會不受鎖的管控</code>

<code>-c, --</code><code>command</code><code>:   在shell中運作一個單獨的指令</code>

<code>-h, --help       顯示幫助</code>

<code>-V, --version:   顯示版本</code>

本文轉自 冰凍vs西瓜 51CTO部落格,原文連結:http://blog.51cto.com/molewan/1924382,如需轉載請自行聯系原作者