crontab使用

Cron
Cron is a time-based job scheduler in Unix-like computer operating systems.The name cron comes from the world chronograph(a time-piece).
Cron enables users to schedule jobs(commands or shell scripts)to run automatically at a certain time or date.It is commonly used to automate system maintenance or administration,though its general purpose nature means that it can be used for other purposes,such as connecting to the Internet and downloading email.

.—————- minute (0 – 59)
| .————- hour (0 – 23)
| | .———- day of month (1 – 31)
| | | .——- month (1 – 12) OR jan,feb,mar,apr …
| | | | .—- day of week (0 – 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
| | | | |
* * * * * command to be executed

其實我倒是認爲使用 Crontab 最常見的一個問題往往是因爲環境變量不對。經常會看到論壇裏有人問:爲什麼我的 Crontab 創建了不執行? 準備創建一條 Cron JOB 的時候,很多人都喜歡在命令行下運行一遍,因爲這個時候環境變量是隨着 Shell 自動帶進來,在 Crontab 中則可能因爲找不到正確的環境變量,JOB 就不能執行。這個小問題就像出天花,一次教訓之後就都記得了。

必須使用的一則技巧
每條 JOB 執行完畢之後,系統會自動將輸出發送郵件給當前系統用戶。日積月累,非常的多,甚至會撐爆整個系統。所以每條 JOB 命令後面進行重定向處理是非常必要的: >/dev/null 2>&1 。前提是對 Job 中的命令需要正常輸出已經作了一定的處理, 比如追加到某個特定日誌文件。

1.直接用crontab命令編輯

cron服務提供crontab命令來設定cron服務的,以下是這個命令的一些參數與說明:

crontab -u //設定某個用戶的cron服務,一般root用戶在執行這個命令的時候需要此參數

crontab -l //列出某個用戶cron服務的詳細內容

crontab -r //刪除沒個用戶的cron服務

crontab -e //編輯某個用戶的cron服務

比如說root查看自己的cron設置:crontab -u root -l

再例如,root想刪除fred的cron設置:crontab -u fred -r

在編輯cron服務時,編輯的內容有一些格式和約定,輸入:crontab -u root -e

進入vi編輯模式,編輯的內容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt

這個格式的前一部分是對時間的設定,後面一部分是要執行的命令,如果要執行的命令太多,可以把這些命令寫到一個腳本里面,然後在這裏直接調用這個腳本就可以了,調用的時候記得寫出命令的完整路徑。時間的設定我們有一定的約定,前面五個*號代表五個數字,數字的取值範圍和含義如下:

分鐘 (0-59)

小時 (0-23)

日期 (1-31)

月份 (1-12)

星期 (0-6)//0代表星期天

除了數字還有幾個個特殊的符號就是”*”、”/”和”-”、”,”,*代表所有的取值範圍內的數字,”/”代表每的意思,”*/5″表示每5個單位,”-”代表從某個數字到某個數字,”,”分開幾個離散的數字。以下舉幾個例子說明問題:

每天早上6點

0 6 * * * echo “Good morning.” >> /tmp/test.txt //注意單純echo,從屏幕上看不到任何輸出,因爲cron把任何輸出都email到root的信箱了。

每兩個小時

0 */2 * * * echo “Have a break now.” >> /tmp/test.txt

晚上11點到早上8點之間每兩個小時,早上八點

0 23-7/2,8 * * * echo “Have a good dream:)” >> /tmp/test.txt

每個月的4號和每個禮拜的禮拜一到禮拜三的早上11點

0 11 4 * 1-3 command line

1月1日早上4點

0 4 1 1 * command line

每次編輯完某個用戶的cron設置後,cron自動在/var/spool/cron下生成一個與此用戶同名的文件,此用戶的cron信息都記錄在這個文件中,這個文件是不可以直接編輯的,只可以用crontab -e 來編輯。cron啓動後每過一份鍾讀一次這個文件,檢查是否要執行裏面的命令。因此此文件修改後不需要重新啓動cron服務。

2.編輯/etc/crontab 文件配置cron

cron 服務每分鐘不僅要讀一次/var/spool/cron內的所有文件,還需要讀一次/etc/crontab,因此我們配置這個文件也能運用cron服務做一些事情。用crontab配置是針對某個用戶的,而編輯/etc/crontab是針對系統的任務。此文件的文件格式是:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root //如果出現錯誤,或者有數據輸出,數據作爲郵件發給這個帳號
HOME=/ //使用者運行的路徑,這裏是根目錄
# run-parts
01 * * * * root run-parts /etc/cron.hourly //每小時執行/etc/cron.hourly內的腳本
02 4 * * * root run-parts /etc/cron.daily //每天執行/etc/cron.daily內的腳本
22 4 * * 0 root run-parts /etc/cron.weekly //每星期執行/etc/cron.weekly內的腳本
42 4 1 * * root run-parts /etc/cron.monthly //每月去執行/etc/cron.monthly內的腳本

大家注意”run-parts”這個參數了,如果去掉這個參數的話,後面就可以寫要運行的某個腳本名,而不是文件夾名了。

參考:
1.http://en.wikipedia.org/wiki/Crontab
 http://www.dbanotes.net/techmemo/crontab_tips.html


2.如果不執行,查看/var/log/crontab或者/var/log/用戶名

總結crontab任務不執行可以從這些方面入手

2.1:請確保手工可以執行該文件(給sh文件增加X權限看文件格式是否爲unix→ set ff? →set ff=unix)

2.2:確認開始crond服務(service crond status/start/stop

2.3: 確認給sh文件制定bash環境

if [ -f ~/.bash_profile ];
then
  . ~/.bash_profile
fi

文件/命令 的路徑最好都用絕對路徑


3.重啓crontab方法

啓一下cron服務,然後再把cronfile加入到cron的管理進程中。


  1. service cron stop  
  2. service cron start  
  3. crontab cronfile  

4.當前路徑獲取方法
bin=$(dirname ${BASH_SOURCE-$0})
bin=$(cd $bin; pwd)
export SETUP_HOME=${bin}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章