新聞中心
crontab 命令來(lái)執(zhí)行循環(huán)定時(shí)任務(wù)。

創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),敦煌企業(yè)網(wǎng)站建設(shè),敦煌品牌網(wǎng)站建設(shè),網(wǎng)站定制,敦煌網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,敦煌網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
在介紹 crontab 命令之前,我們首先要介紹一下 crond,因?yàn)?crontab 命令需要 crond 服務(wù)支持。crond 是 linux 下用來(lái)周期地執(zhí)行某種任務(wù)或等待處理某些事件的一個(gè)守護(hù)進(jìn)程,和 Windows 中的計(jì)劃任務(wù)有些類(lèi)似。
crond 服務(wù)的啟動(dòng)和自啟動(dòng)方法如下:
[root@localhost ~]# service crond restart
停止 crond: [確定]
正在啟動(dòng) crond: [確定]
#重新啟動(dòng)crond服務(wù)
[root@localhost ~]# chkconfig crond on
#設(shè)定crond服務(wù)為開(kāi)機(jī)自啟動(dòng)
其實(shí),在安裝完成操作系統(tǒng)后,默認(rèn)會(huì)安裝 crond 服務(wù)工具,且 crond 服務(wù)默認(rèn)就是自啟動(dòng)的。crond 進(jìn)程每分鐘會(huì)定期檢查是否有要執(zhí)行的任務(wù),如果有,則會(huì)自動(dòng)執(zhí)行該任務(wù)。
接下來(lái),在介紹 crontab 命令。該命令和 at 命令類(lèi)似,也是通過(guò) /etc/cron.allow 和 /etc/cron.deny 文件來(lái)限制某些用戶(hù)是否可以使用 crontab 命令的。而且原則也非常相似:
- 當(dāng)系統(tǒng)中有 /etc/cron.allow 文件時(shí),只有寫(xiě)入此文件的用戶(hù)可以使用 crontab 命令,沒(méi)有寫(xiě)入的用戶(hù)不能使用 crontab 命令。同樣,如果有此文件,/etc/cron.deny 文件會(huì)被忽略,因?yàn)?/etc/cron.allow 文件的優(yōu)先級(jí)更高。
- 當(dāng)系統(tǒng)中只有 /etc/cron.deny 文件時(shí),寫(xiě)入此文件的用戶(hù)不能使用 crontab 命令,沒(méi)有寫(xiě)入文件的用戶(hù)可以使用 crontab 命令。
- 這個(gè)規(guī)則基本和 at 命令的規(guī)則一致,同樣是 /etc/cron.allow 文件比 /etc/cron.deny 文件的優(yōu)先級(jí)高,Linux 系統(tǒng)中默認(rèn)只有 /etc/cron.deny 文件。
每個(gè)用戶(hù)都可以實(shí)現(xiàn)自己的 crontab 定時(shí)任務(wù),只需使用這個(gè)用戶(hù)身份執(zhí)行“crontab -e”命令即可。當(dāng)然,這個(gè)用戶(hù)不能寫(xiě)入 /etc/cron.deny 文件。
crontab 命令的基本格式如下:
[root@localhost ~]# crontab [選項(xiàng)] [file]
注意,這里的 file 指的是命令文件的名字,表示將 file 作為 crontab 的任務(wù)列表文件并載入 crontab,若在命令行中未指定文件名,則此命令將接受標(biāo)準(zhǔn)輸入(鍵盤(pán))上鍵入的命令,并將它們鍵入 crontab。
與此同時(shí),表 1 羅列出了此命令常用的選項(xiàng)及功能。
| 選項(xiàng) | 功能 |
|---|---|
| -u user | 用來(lái)設(shè)定某個(gè)用戶(hù)的 crontab 服務(wù),例如 "-u demo" 表示設(shè)備 demo 用戶(hù)的 crontab 服務(wù),此選項(xiàng)一般有 root 用戶(hù)來(lái)運(yùn)行。 |
| -e | 編輯某個(gè)用戶(hù)的 crontab 文件內(nèi)容。如果不指定用戶(hù),則表示編輯當(dāng)前用戶(hù)的 crontab 文件。 |
| -l | 顯示某用戶(hù)的 crontab 文件內(nèi)容,如果不指定用戶(hù),則表示顯示當(dāng)前用戶(hù)的 crontab 文件內(nèi)容。 |
| -r | 從 /var/spool/cron 刪除某用戶(hù)的 crontab 文件,如果不指定用戶(hù),則默認(rèn)刪除當(dāng)前用戶(hù)的 crontab 文件。 |
| -i | 在刪除用戶(hù)的 crontab 文件時(shí),給確認(rèn)提示。 |
其實(shí) crontab 定時(shí)任務(wù)非常簡(jiǎn)單,只需執(zhí)行“crontab -e”命令,然后輸入想要定時(shí)執(zhí)行的任務(wù)即可。不過(guò),當(dāng)我們執(zhí)行“crontab -e”命令時(shí),打開(kāi)的是一個(gè)空文件,而且操作方法和 Vim 是一致的。那么,這個(gè)文件的格式才是我們真正需要學(xué)習(xí)的內(nèi)容。文件格式如下:
[root@localhost !]# crontab -e
#進(jìn)入 crontab 編輯界面。會(huì)打開(kāi)Vim編輯你的任務(wù)
* * * * * 執(zhí)行的任務(wù)
這個(gè)文件中是通過(guò) 5 個(gè)“*”來(lái)確定命令或任務(wù)的執(zhí)行時(shí)間的,這 5 個(gè)“*”的具體含義如表 2 所示。
| 項(xiàng)目 | 含義 | 范圍 |
|---|---|---|
| 第一個(gè)"*" | 一小時(shí)當(dāng)中的第幾分鐘(minute) | 0~59 |
| 第二個(gè)"*" | 一天當(dāng)中的第幾小時(shí)(hour) | 0~23 |
| 第三個(gè)"*" | 一個(gè)月當(dāng)中的第幾天(day) | 1~31 |
| 第四個(gè)"*" | 一年當(dāng)中的第幾個(gè)月(month) | 1~12 |
| 第五個(gè)"*" | 一周當(dāng)中的星期幾(week) | 0~7(0和7都代表星期日) |
在時(shí)間表示中,還有一些特殊符號(hào)需要學(xué)習(xí),如表 3 所示。
| 特殊符號(hào) | 含義 |
|---|---|
| *(星號(hào)) | 代表任何時(shí)間。比如第一個(gè)"*"就代表一小時(shí)種每分鐘都執(zhí)行一次的意思。 |
| ,(逗號(hào)) | 代表不連續(xù)的時(shí)間。比如"0 8,12,16***命令"就代表在每天的 8 點(diǎn) 0 分、12 點(diǎn) 0 分、16 點(diǎn) 0 分都執(zhí)行一次命令。 |
| -(中杠) | 代表連續(xù)的時(shí)間范圍。比如"0 5 ** 1-6命令",代表在周一到周六的凌晨 5 點(diǎn) 0 分執(zhí)行命令。 |
| /(正斜線(xiàn)) | 代表每隔多久執(zhí)行一次。比如"*/10****命令",代表每隔 10 分鐘就執(zhí)行一次命令。 |
當(dāng)“crontab -e”編輯完成之后,一旦保存退出,那么這個(gè)定時(shí)任務(wù)實(shí)際就會(huì)寫(xiě)入 /var/spool/cron/ 目錄中,每個(gè)用戶(hù)的定時(shí)任務(wù)用自己的用戶(hù)名進(jìn)行區(qū)分。而且 crontab 命令只要保存就會(huì)生效,只要 crond 服務(wù)是啟動(dòng)的。知道了這 5 個(gè)時(shí)間字段的含義,我們多舉幾個(gè)時(shí)間的例子來(lái)熟悉一下時(shí)間字段,如表 4 所示。
| 時(shí)間 | 含義 |
|---|---|
| 45 22 ***命令 | 在 22 點(diǎn) 45 分執(zhí)行命令 |
| 0 17 ** 1命令 | 在每周一的 17 點(diǎn) 0 分執(zhí)行命令 |
| 0 5 1,15**命令 | 在每月 1 日和 15 日的凌晨 5 點(diǎn) 0 分執(zhí)行命令 |
| 40 4 ** 1-5命令 | 在每周一到周五的凌晨 4 點(diǎn) 40 分執(zhí)行命令 |
| */10 4 ***命令 | 在每天的凌晨 4 點(diǎn),每隔 10 分鐘執(zhí)行一次命令 |
| 0 0 1,15 * 1命令 | 在每月 1 日和 15 日,每周一個(gè) 0 點(diǎn) 0 分都會(huì)執(zhí)行命令,注意:星期幾和幾日最好不要同時(shí)出現(xiàn),因?yàn)樗鼈兌x的都是天,非常容易讓管理員混淆 |
現(xiàn)在我們已經(jīng)對(duì)這 5 個(gè)時(shí)間字段非常熟悉了,可是在“執(zhí)行的任務(wù)”字段中都可以寫(xiě)什么呢?既可以定時(shí)執(zhí)行系統(tǒng)命令,也可以定時(shí)執(zhí)行某個(gè) Shell 腳本,這里舉幾個(gè)實(shí)際的例子。
【例 1】讓系統(tǒng)每隔 5 分鐘就向 /tmp/test 文件中寫(xiě)入一行“11”,驗(yàn)證一下系統(tǒng)定時(shí)任務(wù)是否會(huì)執(zhí)行。
[root@localhost ~]# crontab -e
#進(jìn)入編輯界面
*/5 * * * * /bin/echo "11" >> /tmp/test
這個(gè)任務(wù)在時(shí)間工作中沒(méi)有任何意義,但是可以很簡(jiǎn)單地驗(yàn)證我們的定時(shí)任務(wù)是否可以正常執(zhí)行。如果覺(jué)得每隔 5 分鐘太長(zhǎng),那就換成“*”,讓它每分鐘執(zhí)行一次。而且和 at 命令一樣,如果我們定時(shí)執(zhí)行的是系統(tǒng)命令,那么最好使用絕對(duì)路徑。
【例 2】讓系統(tǒng)在每周二的凌晨 5 點(diǎn) 05 分重啟一次。
[root@localhost ~]# crontab -e
5.5 * * 2 /sbin/shutdown -r now
如果服務(wù)器的負(fù)載壓力比較大,則建議每周重啟一次,讓系統(tǒng)狀態(tài)歸零。比如絕大多數(shù)游戲服務(wù)器每周維護(hù)一次,維護(hù)時(shí)最主要的工作就是重啟,讓系統(tǒng)狀態(tài)歸零。這時(shí)可以讓我們的服務(wù)器自動(dòng)來(lái)定時(shí)執(zhí)行。
【例 3】在每月 1 日、10 日、15 日的凌晨 3 點(diǎn) 30 分都定時(shí)執(zhí)行日志備份腳本 autobak.sh。
[root@localhost ~]# crontab -e
30.3 1,10,15 * * /root/sh/autobak.sh
這些定時(shí)任務(wù)保存之后,就可以在指定的時(shí)間執(zhí)行了。我們可以使用命令來(lái)查看和刪除定時(shí)任務(wù),命令如下:
[root@localhost ~]# crontab -l
#查看root用戶(hù)的crontab任務(wù)
*/5 * * * * /bin/echo "11" >> /tmp/test
5.5 * * 2 /sbin/shutdown -r now
30.3 1,10,15 * * /root/sh/autobak.sh
[root@localhost ~]# crontab -r
#刪除root用戶(hù)所有的定時(shí)任務(wù)。如果只想刪除某個(gè)定時(shí)任務(wù),則可以執(zhí)行“crontab -e”命令進(jìn)入
#編輯模式手工刪除
[root@localhost ~]# crontab -l
no crontab for root
#刪除后,再查詢(xún)就沒(méi)有root用戶(hù)的定時(shí)任務(wù)了
在書(shū)寫(xiě) crontab 定時(shí)任務(wù)時(shí),需要注意以下幾個(gè)事項(xiàng):
- 6 個(gè)選項(xiàng)都不能為空,必須填寫(xiě)。如果不確定,則使用“*”代表任意時(shí)間。
- crontab 定時(shí)任務(wù)的最小有效時(shí)間是分鐘,最大有效時(shí)間是月。像 2018 年某時(shí)執(zhí)行、3 點(diǎn) 30 分 30 秒這樣的時(shí)間都不能被識(shí)別。
- 在定義時(shí)間時(shí),日期和星期最好不要在一條定時(shí)任務(wù)中出現(xiàn),因?yàn)樗鼈兌家蕴鞛閱挝唬浅H菀鬃尮芾韱T混淆。
- 在定時(shí)任務(wù)中,不管是直接寫(xiě)命令,還是在腳本中寫(xiě)命令,最好都使用絕對(duì)路徑。有時(shí)使用相對(duì)路徑的命令會(huì)報(bào)錯(cuò)。
系統(tǒng)的crontab設(shè)置
“crontab -e”是每個(gè)用戶(hù)都可以執(zhí)行的命令,也就是說(shuō),不同的用戶(hù)身份可以執(zhí)行自己的定時(shí)任務(wù)。但是有些定時(shí)任務(wù)需要系統(tǒng)執(zhí)行,這時(shí)就需要編輯 /etc/crontab 這個(gè)配置文件了。
當(dāng)然,并不是說(shuō)寫(xiě)入 /etc/crontab 配置文件中的定時(shí)任務(wù)在執(zhí)行時(shí)不需要用戶(hù)身份,而是“crontab -e”命令在定義定時(shí)任務(wù)時(shí),默認(rèn)用戶(hù)身份是當(dāng)前登錄用戶(hù)。而在修改 /etc/crontab 配置文件時(shí),定時(shí)任務(wù)的執(zhí)行者身份是可以手工指定的。這樣定時(shí)任務(wù)的執(zhí)行會(huì)更加靈活,修改起來(lái)也更加方便。
那我們打開(kāi)這個(gè)文件看看吧,如下:
[root@localhost ~]# vi /etc/crontab
SHELL=/bin/bash
#標(biāo)識(shí)使用哪種Shell
PATH=/sbin:/bin:/usr/sbin:/usr/bin
#指定PATH環(huán)境變量。crontab使用自己的PATH,而不使用系統(tǒng)默認(rèn)的PATH,所以在定時(shí)任務(wù)中出現(xiàn)的
#命令最好使用大寫(xiě)
MAILTO=root
#如果有報(bào)錯(cuò)輸出,或命令結(jié)果有輸出,則會(huì)向root發(fā)送信息
HOME=/
#標(biāo)識(shí)主目錄
# For details see man 4 crontabs
#提示大家可以去“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
#分 時(shí)日月周執(zhí)行者身份命令
#列出文件格式,并加入了注釋
在 CentOS 6.x 中,/etc/crontab 文件也發(fā)生了變化。在 CentOS 5.x 中,這個(gè)文件的內(nèi)容大概是這樣子的:
#以下輸出在CentOS 5.5中
[root@sc ~]# vi /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02.4 * * * root run-parts /etc/cron.daily
22.4 * * 0 root run-parts /etc/cron.weekly
42.4 1 * * root run-parts /etc/cron.monthly
在 CentOS 5.x 中,/etc/crontab 文件會(huì)使用 run-parts 腳本執(zhí)行 /etc/cron.{daily,weekly,monthly} 目錄中的所有文件。這個(gè) run-parts 其實(shí)是一個(gè) Shell 腳本,保存在 /usr/bin/run-parts 中,它的作用就是把其后面跟隨的目錄中的所有可執(zhí)行文件依次執(zhí)行。也就是說(shuō),如果我們想讓某個(gè)腳本在每天都執(zhí)行一次,那么可以不用手工去寫(xiě)定時(shí)任務(wù),而只需要給這個(gè)腳本賦予執(zhí)行權(quán)限,并把它放入 /etc/cron.daily/ 目錄中,這樣這個(gè)腳本就會(huì)在每天的凌晨 4 點(diǎn) 02 分執(zhí)行了。
但是在 CentOS 6.x 中,/etc/crontab 文件中不再有相關(guān)的段落,那么 run-ptars 這種定時(shí)任務(wù)的執(zhí)行方法是否不可用了呢?
我們看到 /etc/crontab 中有一句提示,讓我們“man 4 crontabs”來(lái)查看幫助,那么我們就看看這個(gè)幫助吧!在這個(gè)幫助中,寫(xiě)明了“在舊版本的 crontab 配置文件中,通過(guò) run-parts 腳本來(lái)調(diào)用 cron.{daily,weekly,monthly} 目錄,定時(shí)執(zhí)行這些目錄中的腳本。在當(dāng)前系統(tǒng)中,為了避免 cron 和 anacron 之間產(chǎn)生沖突,只要 anacron 已經(jīng)安裝,就使用 anacron 來(lái)執(zhí)行這些目錄中的腳本。具體可以查看 anacron(8) 的幫助”。對(duì)于 anacron 的用法,后續(xù)章節(jié)再詳解介紹。
其實(shí),對(duì)用戶(hù)來(lái)講,并不需要知道這個(gè)定時(shí)任務(wù)到底是由哪個(gè)程序調(diào)用的。我們需要知道的事情是如何使用系統(tǒng)的 crontab 設(shè)置。對(duì)此,新、老版本的 CentOS 沒(méi)有區(qū)別,配置方法都有兩種。
第一種方法就是把需要定時(shí)執(zhí)行的工作寫(xiě)成腳本程序,并賦予執(zhí)行權(quán)限,然后直接把這個(gè)腳本復(fù)制到 /etc/cron.{daily,weekly,monthly} 目錄中的任意一個(gè)。比如,我需要讓某個(gè)腳本每周執(zhí)行,就把這個(gè)腳本復(fù)制到 /etc/cron.weekly/ 目錄中。這樣這個(gè)腳本就會(huì)每周執(zhí)行一次,具體的執(zhí)行時(shí)間要參考 anacron 的配置文件。
第二種方法就是修改 /etc/crontab 這個(gè)配置文件,加入自己的定時(shí)任務(wù),不過(guò)需要注意指定腳本的執(zhí)行者身份。例如:
[root@localhost ~]# vi /etc/crontab
…省略部分輸出…
* * * * * root run-parts /root/cron/
#讓系統(tǒng)每分鐘都執(zhí)行一次/root/cron/目錄中的腳本,腳本執(zhí)行者是root用戶(hù)
#雖然在CentOS 6.x中不直接通過(guò)此配置文件調(diào)用/etc/cron.{daily,weekly,monthly}這些目錄,但是run-parts腳本還是可以使用的。所以我完全可以參照CentOS 5.x的方法來(lái)寫(xiě)定時(shí)任務(wù)
#使用run-parts腳本調(diào)用并執(zhí)行/root/cron/目錄中所有的可執(zhí)行文件
[root@localhost ~]# mkdir cron
#建立/root/cron/目錄
[root@localhost cron]# vi /root/cron/hello.sh
#/bin/bash
echo "hello" >> /root/cron/hello.log
#在/root/cron/hello.log文件中寫(xiě)入“hello”
[root@localhost cron]# chmod 755 hello.sh
#賦予執(zhí)行權(quán)限
#因?yàn)閔ello.sh腳本放入了/root/cron/目錄中,所以每分鐘執(zhí)行一次。
只要保存 /etc/crontab 文件,這個(gè)定時(shí)任務(wù)就可以執(zhí)行了。當(dāng)然要確定 crond 服務(wù)是運(yùn)行的。
這兩種方法都是可以使用的,具體看個(gè)人的習(xí)慣。不過(guò),要想修改 /etc/crontab 文件,必須是 root 用戶(hù),普通用戶(hù)不能修改,只能使用用戶(hù)身份的 crontab 命令。
分享標(biāo)題:Linuxcrontab命令:循環(huán)執(zhí)行定時(shí)任務(wù)(詳解版)
當(dāng)前網(wǎng)址:http://fisionsoft.com.cn/article/dhocegh.html


咨詢(xún)
建站咨詢(xún)
