linux之crontab定時執行命令走過的坑坑

冰凡發表於2016-12-23

Learn from one's mistakes!

經歷過坑坑,就會吃一塹長一智!錯誤使我們快速成長!

對crontab的基礎瞭解:

利用crontab可以在linux上面建立定時任務工作,該工作會被記錄到/var/spool/cron裡面去,該記錄已帳號為區分,不信你可以執行下面命令進去看下:

[root@ccw cron]# cd /var/spool/cron/
[root@ccw cron]# ls
root


crontab的執行定時任務的記錄會寫入到/var/log/cron這個檔案中,不信你可以用下面命令檢視

[root@ccw ~]# tail -f /var/log/cron

crontab的執行最低頻率是一分鐘,cron 會每分鐘去讀取一次 /etc/crontab 與 /var/spool/cron 裡面的資料內容

crontab的基本命令操作:

crontab命令主要有3個引數:

  -e :編輯使用者的crontab。執行crontab -e命令後就可以在裡面編寫定時任務執行命令;例子:

執行 crontab -e

# 此時會進入 vi 的編輯畫面讓您編輯工作!注意到,每項工作都是一行。

#分 時 日  月 周      任務的完整命令列

 *  *  *  *  *       /www/task.sh

  -l :列出使用者的crontab的內容。

  -r :刪除使用者的crontab的內容。

檢視crontab服務狀態:service crond status

手動啟動crontab服務:service crond start;一般不需要重新啟動,但有些系統比較另類,就需要了!

走坑一:linux系統時間不正常,定時任務死活執行不了

php測試指令碼執行沒錯,結果放到crontab裡面就不行了;查了N久,結果坑比,因為php測試指令碼有個時間對比,時間大於某個點(2016-12-13 9:00:00)就開始執行,由於系統時間沒跟網路時間同步是錯誤的,結果測試的時候一直小於時間點(2016-12-13 9:00:00

跳坑方法,同步系統時間為網路時間,執行命令如下:

ntpdate cn.pool.ntp.org
hwclock -w

走坑二:環境變數引起,shell指令碼單獨執行ok,定時任務死活執行不了

寫了個備份mysql資料庫的指令碼shell,單獨執行沒任務問題;但是放到crontab執行就不行了

跳坑方法,在shell指令碼之前,執行下系統環境生效,如下:

#!/bin/sh
source /etc/profile


走坑三:執行許可權設定引起,shell指令碼沒執行許可權

跳坑方法:對需要執行的指令碼執行命令:chmod +x  xx.shell

走坑四:執行定時任務重複執行

跳坑方法:需要加鎖機制或者指令碼自己處理

使用linux flock 檔案鎖實現任務鎖定,解決衝突;當任務未執行完,則不會進行下一次任務執行。例子:

* * * * * flock -xn /tmp/mytest.lock -c 'php /home/test.php' 
flock命令詳解如下:

-s, --shared:    獲得一個共享鎖  
-x, --exclusive: 獲得一個獨佔鎖  
-u, --unlock:    移除一個鎖,通常是不需要的,指令碼執行完會自動丟棄鎖  
-n, --nonblock:  如果沒有立即獲得鎖,直接失敗而不是等待  
-w, --timeout:   如果沒有立即獲得鎖,等待指定時間  
-o, --close:     在執行命令前關閉檔案的描述符號。用於如果命令產生子程式時會不受鎖的管控  
-c, --command:   在shell中執行一個單獨的命令  
-h, --help       顯示幫助  
-V, --version:   顯示版本















相關文章