1. 程式人生 > >linux定時任務crontab詳解

linux定時任務crontab詳解

將不 絕對路徑 lin csdn 似的 文件內容 關閉 HERE 自動啟動

1、Crontab程序

  crontab命令常見於Unix和類Unix的操作系統之中,用於設置周期性被執行的指令。

  crontab文件包含送交cron守護進程的一系列作業和指令。每個用戶可以擁有自己的crontab文件;同時,操作系統保存一個針對整個系統的crontab文件,該文件通常是/etc/crontab,而這個文件只能由系統管理員來修改。

  cronie:主程序包,提供crond守護進程及相關輔助工具。

# rpm -ql cronie
/etc/cron.d
/etc/cron.d/0hourly
/etc/cron.deny #權限控制,黑名單
/etc/pam.d/crond
/etc/sysconfig/crond
/usr/bin/crontab /usr/lib/systemd/system/crond.service /usr/sbin/crond /var/spool/cron

  crontabs:系統自帶的一些計劃任務。

# rpm -ql crontabs
/etc/cron.daily
/etc/cron.hourly
/etc/cron.monthly
/etc/cron.weekly
/etc/crontab
/etc/sysconfig/run-parts
/usr/bin/run-parts

  cronie-anacron:cronie的補充程序,用於監控cronie任務的執行狀況。

# rpm -ql cronie-anacron
/etc/anacrontab /etc/cron.hourly/0anacron /usr/sbin/anacron /var/spool/anacron /var/spool/anacron/cron.daily /var/spool/anacron/cron.monthly /var/spool/anacron/cron.weekly

  對於24小時開機運行的服務器可能用不到的,但是對非24小時開機,又想定時運行任務的機器還是十分有用的。

  anacrontab負責執行 /etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly 中的系統任務。
  當執行任務時,更新/var/spool/anacron/文件的時間戳。

  anacron的配置與cron類似,也是要首先配置一個叫anacrontab的文件,其文件格式說明一般在manual裏有man anacrontab

# vim /etc/anacrontab

@reboot : Run once after reboot.
@yearly : Run once a year, ie. "0 0 1 1 *".
@annually : Run once a year, ie. "0 0 1 1 *".
@monthly : Run once a month, ie. "0 0 1 * *".
@weekly : Run once a week, ie. "0 0 * * 0".
@daily : Run once a day, ie. "0 0 * * *".
@hourly : Run once an hour, ie. "0 * * * *".

  anacron的工作原理參考這裏:http://blog.csdn.net/deerlux/article/details/51090531

  crontab在 /etc 目錄下面存在 cron.d、cron.daily、cron.weekly、cron.monthly、cron.hourly 五個目錄和 crontab、cron.deny 二個文件。

cron.daily是每天執行一次的job
cron.weekly是每個星期執行一次的job
cron.monthly是每月執行一次的job
cron.hourly是每個小時執行一次的job

cron.d是系統自動定期需要執行的任務,如果不是按小時,按天,按星期,按月來執行的,那麽就放在這個目錄下面。 如果是按小時,按天,按星期,按月的來執行的話,則可以放到前面相應的目錄下面去。
/etc/cron.hourly/ 的執行任務定義在 /etc/cron.d/0hourly 文件中。

  在/var/spool下面存在著兩個目錄cron,anacron。

/var/spool/cron 目錄下面是每個用戶自己通過 crontab -e 增加的crontab的內容。
/var/spool/anacron 目錄下面是記錄的是cron.daily,cron.monthly,cron.weekly上一次執行的時間。

  crond服務每隔一分鐘去讀取一次/var/spool/cron,/etc/crontab,/etc/cron.d 下面的所有內容,以實現任務的執行。

2、crontab權限

  /etc/cron.allow 和 /etc/cron.deny 文件被用來限制對 cron 的使用。
  這兩個控制文件的格式都是每行一個用戶。兩個文件都不允許有空格。
  如果控制文件被修改了,cron守護進程 crond 不必重啟。控制文件在每次用戶添加或刪除一項 cron 任務時都會被讀取。

  /etc/cron.allow 的優先級高於 /etc/cron.deny。
  如果 cron.allow 文件存在,只有其中列出的用戶才被允許使用 cron,並且cron.deny 文件會被忽略。
  如果 cron.allow 文件不存在,所有在cron.deny 中列出的用戶都被禁止使用 cron。

3、crontab命令

crontab [-u user] [-l | -r | -e] [-i]

-u user:用來設定某個用戶的crontab服務,例如,“-u ixdba”表示設定ixdba用戶的crontab服務,此參數一般有root用戶來運行。

file:file是命令文件的名字,表示將file做為crontab的任務列表文件並載入crontab。如果在命令行中沒有指定這個文件,crontab命令將接受標準輸入(鍵盤)上鍵入的命令,並將它們
  載入crontab。
-e:編輯某個用戶的crontab文件內容。如果不指定用戶,則表示編輯當前用戶的crontab文件。
-l:顯示某個用戶的crontab文件內容,如果不指定用戶,則表示顯示當前用戶的crontab文件內容。
-r:從/var/spool/cron目錄中刪除某個用戶的crontab文件,如果不指定用戶,則默認刪除當前用戶的crontab文件。
-i:在刪除用戶的crontab文件時給確認提示。 

4、crontab語法

  crond 是linux下用來周期性的執行某種任務或等待處理某些事件的一個守護進程,與windows下的計劃任務類似,當安裝完成操作系統後,默認會安裝此服務 工具,並且會自動啟動crond進程,crond進程每分鐘會定期檢查是否有要執行的任務,如果有要執行的任務,則自動執行該任務。

  Linux下的任務調度分為兩類,系統任務調度用戶任務調度

  系統任務調度:系統周期性所要執行的工作,比如寫緩存數據到硬盤、日誌清理等。在/etc目錄下有一個crontab文件,這個就是系統任務調度的配置文件。

  1、系統cron任務

系統的crontab存放在 /etc/crontab
# vim /etc/crontab

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- 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
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

a、每一行定義一個周期性任務,共7個字段。
b、此處的環境變量不同於用戶登錄後獲得的環境,因此建議命令使用絕對路徑。
c、執行結果會發送郵件給mailto指定的用戶。

  2、用戶cron任務

用戶的crontab文件存放在 /var/spool/cron/USERNAME

# crontab -e -u USERNAME

a、每一行定義一個周期性任務,共6個字段。
b、此處的環境變量不同於用戶登錄後獲得的環境,因此建議命令使用絕對路徑。
c、執行結果會發送郵件給當前用戶。
星號(*)匹配所有有效的值。
短橫線(-)表示範圍連續取值。
逗號(,)表示離散取值。
正斜線(/)指定間隔頻率。例如,0-59/2 在分鐘字段表示每兩分鐘。
  
指定的時間點不能被步長整除時,其意義將不存在。例如 */7 * * * *

註意:%在crontab中被認為是newline,使用時需要用 \ 轉義。比如crontab文件中,如果有 "date +%Y%m%d",必須替換為:"date +\%Y\%m\%d"。

技術分享圖片

  crontab的最小時間單位為”分鐘“,想完成”秒“級任務,得需要借助於其它方式。
  先定義為每分鐘任務,再利用腳本實現在每分鐘之內,循環執行多次。

sleep命令
delay for a specified amount of time.
s: 秒,默認單位
m: 分
h: 小時
d: 天

usleep命令
sleep some number of microseconds.The default is 1.
# usleep 1000000 休眠1秒

  示例:

*/5 * * * *         每5分鐘執行一次
3 * * * *           每小時的第3分鐘執行一次
3 4 * * 5           每周5的4點3分執行一次
5 6 7 * *           每月的7號的6點5分執行一次
7 8 9 10 *          每年的10月9號8點7分執行一次
9 8 * * 3,7         每周3和周日的8點9分
0 8,20 * * 3,7      每周3和周日的8點和20點執行一次
0 9-18 * * 1-5      周一到周五的9-18點,即工作時間內的每小時
0 7 25 12 *         每年的12月25號7點執行一次

5、crontab服務

安裝crontab:

yum install crontabs

服務操作說明:

/sbin/service crond start //啟動服務
/sbin/service crond stop //關閉服務
/sbin/service crond restart //重啟服務
/sbin/service crond reload //重新載入配置
/sbin/service crond status //啟動服務

查看crontab服務是否已設置為開機啟動,執行命令:
ntsysv

加入開機自動啟動:
chkconfig –level 35 crond on

6、常用方法

  1). 創建一個新的crontab文件

  在考慮向cron進程提交一個crontab文件之前,首先要做的一件事情就是設置環境變量EDITOR。cron進程根據它來確定使用哪個編輯器編輯 crontab文件。99%的UNIX和LINUX用戶都使用vi,如果你也是這樣,那麽你就編輯$ HOME目錄下的. profile文件,在其 中加入這樣一行:

EDITOR=vi; export EDITOR

  然後保存並退出。不妨創建一個名為<user> cron的文件,其中<user>是用戶名,例如, davecron。在該文件中加入如下的內容。

# (put your own initials here)echo the date to the console every
# 15minutes between 6pm and 6am
0,15,30,45 18-06 * * * /bin/echodate’ > /dev/console

  保存並退出。確信前面5個域用空格分隔。

  在上面的例子中,系統將每隔1 5分鐘向控制臺輸出一次當前時間。如果系統崩潰或掛起,從最後所顯示的時間就可以一眼看出系統是什麽時間停止工作的。在有些 系統中,用tty1來表示控制臺,可以根據實際情況對上面的例子進行相應的修改。為了提交你剛剛創建的crontab文件,可以把這個新創建的文件作為 cron命令的參數:

$ crontab davecron

  現在該文件已經提交給cron進程,它將每隔15分鐘運行一次。

  同時,新創建文件的一個副本已經被放在/var/spool/cron目錄中,文件名就是用戶名(即dave)。

  2). 列出crontab文件

  為了列出crontab文件,可以用:

$ crontab -l
0,15,30,45,18-06 * * * /bin/echo `date` > dev/tty1

  你將會看到和上面類似的內容。可以使用這種方法在$HOME目錄中對crontab文件做一備份:

$ crontab -l > $HOME/mycron

  這樣,一旦不小心誤刪了crontab文件,可以用上一節所講述的方法迅速恢復。

  3). 編輯crontab文件

  如果希望添加、刪除或編輯crontab文件中的條目,而E D I TO R環境變量又設置為v i,那麽就可以用v i來編輯crontab文件,相應的命令為:

$ crontab -e

  可以像使用vi編輯其他任何文件那樣修改crontab文件並退出。如果修改了某些條目或添加了新的條目,那麽在保存該文件時,cron會對其進行必要的完整性檢查。如果其中的某個域出現了超出允許範圍的值,它會提示你。

  我們在編輯crontab文件時,沒準會加入新的條目。例如,加入下面的一條:

# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month
30 3 1,7,14,21,26 * * /bin/find -name “core’ -exec rm {} \;

  現在保存並退出。最好在crontab文件的每一個條目之上加入一條註釋,這樣就可以知道它的功能、運行時間,更為重要的是,知道這是哪位用戶的作業。

  現在讓我們使用前面講過的crontab -l命令列出它的全部信息:

$ crontab -l
# (crondave installed on Tue May 4 13:07:43 1999)
# DT:ech the date to the console every 30 minites
0,15,30,45 18-06 * * * /bin/echo `date` > /dev/tty1
# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month
30 3 1,7,14,21,26 * * /bin/find -name “core’ -exec rm {} \;

  4). 刪除crontab文件

  要刪除crontab文件,可以用:

$ crontab -r

  5). 恢復丟失的crontab文件

  如果不小心誤刪了crontab文件,假設你在自己的$HOME目錄下還有一個備份,那麽可以將其拷貝到/var/spool/cron/<username>,其中<username>是用戶名。如果由於權限問題無法完成拷貝,可以用:

$ crontab <filename>

  其中,<filename>是你在$HOME目錄中副本的文件名。

  我建議你在自己的 $HOME目錄中保存一個該文件的副本。我就有過類似的經歷,有數次誤刪了crontab文件(因為r鍵緊挨在e鍵的右邊)。這就是為什麽有些系統文檔建議不要直接編輯crontab文件,而是編輯該文件的一個副本,然後重新提交新的文件。

  有些crontab的變體有些怪異,所以在使用crontab命令時要格外小心。如果遺漏了任何選項,crontab可能會打開一個空文件,或者看起來像是個空文件。這時敲delete鍵退出,不要按<Ctrl-D>,否則你將丟失crontab文件。

linux定時任務crontab詳解