1. 程式人生 > >crontab計劃任務無法執行(小結)

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

crontab

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

1、環境變量是否定義

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

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


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

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


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

*/5 * * * * /usr/local/php/bin/php /shells/cron/delete_redis.php >/dev/null 2>&1
檢查發現,php並沒有正常執行,可能是因為php中沒配置絕對路徑
解決方法:
*/5 * * * * cd /var/www/cron && /usr/local/php/bin/php /shells/cron/delete_redis.php >/dev/null 2>&1

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

CentOS6下(使用lockf或者flock):

*/10 * * * *   (/usr/bin/lockf  -s -t 0  /tmp/test.lock    /usr/local/php/bin/php test.php >/dev/null 2>&1)
lockf下參數說明:
-k: 一直等待獲取文件鎖
-s:不發出任何信息,即使拿不到文件鎖
-t seconds:設定timeout超時時間是seconds秒,如果超過時間,則自動放棄

CentOS7下(使用flock)

*/10 * * * * root flock -xn /tmp/mytest.lock -c ‘cd /var/www/cron && /usr/local/php/bin/php /shells/cron/delete_redis.php‘>/dev/null 2>&1
這樣當任務未執行完成,下一任務判斷到/tmp/mytest.lock被鎖定,則結束當前的任務,下一周期再判斷。
flock參數說明:
-s, --shared:    獲得一個共享鎖
-x, --exclusive: 獲得一個獨占鎖
-u, --unlock:    移除一個鎖,通常是不需要的,腳本執行完會自動丟棄鎖
-n, --nonblock:  如果沒有立即獲得鎖,直接失敗而不是等待
-w, --timeout:   如果沒有立即獲得鎖,等待指定時間
-o, --close:     在運行命令前關閉文件的描述符號。用於如果命令產生子進程時會不受鎖的管控
-c, --command:   在shell中運行一個單獨的命令
-h, --help       顯示幫助
-V, --version:   顯示版本



本文出自 “冰凍vs西瓜” 博客,請務必保留此出處http://molewan.blog.51cto.com/287340/1924382

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