您好,歡迎來到創立網絡工作室官方網站!ZJJCL.CN
新聞動态
您現在的(de)位置:首頁 > 技術文摘
Linux定時任務Crontab命令用法詳解
來源:創立工作室 作者:馮軍 發布時間:2020-10-12 17:35:08 閱讀 1585 次

Linux 系統定時任務則是由 cron (crond) 這個系統服務來控制的(de)。Linux 系統上面原本就有非常多的(de)計劃性工作,因此這個系統服務是默認啓動的(de)。另外, 由于使用者自(zì)己也可(kě)以設置計劃任務,所以, Linux 系統也提供了使用者控制計劃任務的(de)命令 :crontab 命令。

一(yī)、crond簡介

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

Linux下的(de)任務調度分為(wèi)兩類,系統任務調度和(hé)用戶任務調度。

系統任務調度

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

/etc/crontab文件包括下面幾行:

cat /etc/crontab

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=HOME=/

# run-parts

51 * * * * root run-parts /etc/cron.hourly

24 7 * * * root run-parts /etc/cron.daily

22 4 * * 0 root run-parts /etc/cron.weekly

42 4 1 * * root run-parts /etc/cron.monthly

前 四行是用來配置crond任務運行的(de)環境變量,第一(yī)行SHELL變量指定了系統要使用哪個shell,這裏是bash,第二行PATH變量指定了系統執行 命令的(de)路徑,第三行MAILTO變量指定了crond的(de)任務執行信息将通過電子(zǐ)郵件發送給root用戶,如(rú)果MAILTO變量的(de)值為(wèi)空,則表示不發送任務 執行信息給用戶,第四行的(de)HOME變量指定了在執行命令或者腳本時使用的(de)主目錄。第六至九行表示的(de)含義将在下個小節詳細講述。這裏不在多說。

用戶任務調度

用戶定期要執行的(de)工作,比如(rú)用戶數據備份、定時郵件提醒等。用戶可(kě)以使用 crontab 工具來定制自(zì)己的(de)計劃任務。所有用戶定義的(de)crontab 文件都被保存在 /var/spool/cron目錄中。其文件名與用戶名一(yī)緻。

使用者權限文件

文件:/etc/cron.deny

說明:該文件中所列用戶不允許使用crontab命令

文件:/etc/cron.allow

說明:該文件中所列用戶允許使用crontab命令

文件:/var/spool/cron/

說明:所有用戶crontab文件存放的(de)目錄,以用戶名命名

crontab文件的(de)含義

用戶所建立的(de)crontab文件中,每一(yī)行都代表一(yī)項任務,每行的(de)每個字段代表一(yī)項設置,它的(de)格式共分為(wèi)六個字段,前五段是時間設定段,第六段是要執行的(de)命令段,格式如(rú)下:

minute hour day month week command

其中:

minute: 表示分鍾,可(kě)以是從0到59之間的(de)任何整數。

hour:表示小時,可(kě)以是從0到23之間的(de)任何整數。

day:表示日期,可(kě)以是從1到31之間的(de)任何整數。

month:表示月份,可(kě)以是從1到12之間的(de)任何整數。

week:表示星期幾,可(kě)以是從0到7之間的(de)任何整數,這裏的(de)0或7代表星期日。

command:要執行的(de)命令,可(kě)以是系統命令,也可(kě)以是自(zì)己編寫的(de)腳本文件。

在以上各個字段中,還可(kě)以使用以下特殊字符:

星号(*):代表所有可(kě)能的(de)值,例如(rú)month字段如(rú)果是星号,則表示在滿足其它字段的(de)制約條件後每月都執行該命令操作。

逗号(,):可(kě)以用逗号隔開的(de)值指定一(yī)個列表範圍,例如(rú),“1,2,5,7,8,9”

中杠(-):可(kě)以用整數之間的(de)中杠表示一(yī)個整數範圍,例如(rú)“2-6”表示“2,3,4,5,6”

正斜線(/):可(kě)以用正斜線指定時間的(de)間隔頻率,例如(rú)“0-23/2”表示每兩小時執行一(yī)次。同時正斜線可(kě)以和(hé)星号一(yī)起使用,例如(rú)*/10,如(rú)果用在minute字段,表示每十分鍾執行一(yī)次。

二、crond服務

安裝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服務是否已設置為(wèi)開機啓動

ntsysv

加入開機自(zì)動啓動

chkconfig –level 35 crond on

三、crontab命令詳解

1.命令格式

crontab [-u user] file

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

2.命令功能

通過crontab 命令,我們可(kě)以在固定的(de)間隔時間執行指定的(de)系統指令或 shell script腳本。時間間隔的(de)單位可(kě)以是分鍾、小時、日、月、周及以上的(de)任意組合。這個命令非常設合周期性的(de)日志分析或數據備份等工作。

3.命令參數

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

file:file是命令文件的(de)名字,表示将file做(zuò)為(wèi)crontab的(de)任務列表文件并載入crontab。如(rú)果在命令行中沒有指定這個文件,crontab命令将接受标準輸入(鍵盤)上鍵入的(de)命令,并将它們載入crontab。

-e:編輯某個用戶的(de)crontab文件內(nèi)容。如(rú)果不指定用戶,則表示編輯當前用戶的(de)crontab文件。

-l:顯示某個用戶的(de)crontab文件內(nèi)容,如(rú)果不指定用戶,則表示顯示當前用戶的(de)crontab文件內(nèi)容。

-r:從/var/spool/cron目錄中删除某個用戶的(de)crontab文件,如(rú)果不指定用戶,則默認删除當前用戶的(de)crontab文件。

-i:在删除用戶的(de)crontab文件時給确認提示。

4.常用方法

1).創建一(yī)個新的(de)crontab文件

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

EDITOR=vi; export EDITOR

然後保存并退出。不妨創建一(yī)個名為(wèi)<user> cron的(de)文件,其中<user>是用戶名,例如(rú), davecron。在該文件中加入如(rú)下的(de)內(nèi)容。

# (put your own initials here)echo the date to the console every

# 15minutes between 6pm and 6am

0,15,30,45 18-06 * * * /bin/echo ‘date’ > /dev/console

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

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

crontab davecron

現在該文件已經提交給cron進程,它将每隔1 5分鍾運行一(yī)次。

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

2). 列出crontab文件

為(wèi)了列出crontab文件,可(kě)以用:

crontab -l

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

你将會看到和(hé)上面類似的(de)內(nèi)容。可(kě)以使用這種方法在$ H O M E目錄中對crontab文件做(zuò)一(yī)備份:

crontab -l > $HOME/mycron

這樣,一(yī)旦不小心誤删了crontab文件,可(kě)以用上一(yī)節所講述的(de)方法迅速恢複。

3). 編輯crontab文件

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

crontab -e

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

我們在編輯crontab文件時,沒準會加入新的(de)條目。例如(rú),加入下面的(de)一(yī)條:

# 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文件的(de)每一(yī)個條目之上加入一(yī)條注釋,這樣就可(kě)以知道(dào)它的(de)功能、運行時間,更為(wèi)重要的(de)是,知道(dào)這是哪位用戶的(de)作業。

如(rú)果出現如(rú)下信息則代表新建成功。

crontab: installing new crontab

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

$ 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文件,可(kě)以用:

crontab -r

5). 恢複丢失的(de)crontab文件

如(rú)果不小心誤删了crontab文件,假設你在自(zì)己的(de)$ H O M E目錄下還有一(yī)個備份,那麽可(kě)以将其拷貝到/var/spool/cron/<username>,其中<username>是用戶名。如(rú)果由于權限問題無法完成拷貝,可(kě)以用:

crontab <filename>

其中,<filename>是你在$ H O M E目錄中副本的(de)文件名。

我建議你在自(zì)己的(de)$ H O M E目錄中保存一(yī)個該文件的(de)副本。我就有過類似的(de)經曆,有數次誤删了crontab文件(因為(wèi)r鍵緊挨在e鍵的(de)右邊)。這就是為(wèi)什麽有些系統文檔建議不要直接編輯crontab文件,而是編輯該文件的(de)一(yī)個副本,然後重新提交新的(de)文件。

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

5.使用實例

實例1:每1分鍾執行一(yī)次command命令:
* * * * * command

實例2:每小時的(de)第3和(hé)第15分鍾執行
命令:
3,15 * * * * command

實例3:在上午8點到11點的(de)第3和(hé)第15分鍾執行
命令:
3,15 8-11 * * * command

實例4:每隔兩天的(de)上午8點到11點的(de)第3和(hé)第15分鍾執行
命令:
3,15 8-11 */2 * * command

實例5:每個星期一(yī)的(de)上午8點到11點的(de)第3和(hé)第15分鍾執行
命令:
3,15 8-11 * * 1 command

實例6:每晚的(de)21:30重啓smb 
命令:
30 21 * * * /etc/init.d/smb restart


實例7:每月1、10、22日的(de)4 : 45重啓smb 
命令:
45 4 1,10,22 * * /etc/init.d/smb restart


實例8:每周六、周日的(de)1 : 10重啓smb
命令:
10 1 * * 6,0 /etc/init.d/smb restart


實例9:每天18 : 00至23 : 00之間每隔30分鍾重啓smb 
命令:
0,30 18-23 * * * /etc/init.d/smb restart


實例10:每星期六的(de)晚上11 : 00 pm重啓smb 
命令:
0 23 * * 6 /etc/init.d/smb restart


實例11:每一(yī)小時重啓smb 
命令:
* */1 * * * /etc/init.d/smb restart


實例12:晚上11點到早上7點之間,每隔一(yī)小時重啓smb 
命令:
* 23-7/1 * * * /etc/init.d/smb restart

實例13:每月的(de)4号與每周一(yī)到周三的(de)11點重啓smb 
命令:
0 11 4 * mon-wed /etc/init.d/smb restart

實例14:一(yī)月一(yī)号的(de)4點重啓smb 
命令:
0 4 1 jan * /etc/init.d/smb restart


實例15:每小時執行/etc/cron.hourly目錄內(nèi)的(de)腳本
命令:
01 * * * * root run-parts /etc/cron.hourly
說明:
run-parts這個參數了,如(rú)果去(qù)掉這個參數的(de)話,後面就可(kě)以寫要運行的(de)某個腳本名,而不是目錄名了

四、使用注意事項

注意環境變量問題

有時我們創建了一(yī)個crontab,但是這個任務卻無法自(zì)動執行,而手動執行這個任務卻沒有問題,這種情況一(yī)般是由于在crontab文件中沒有配置環境變量引起的(de)。

在 crontab文件中定義多個調度任務時,需要特别注意的(de)一(yī)個問題就是環境變量的(de)設置,因為(wèi)我們手動執行某個任務時,是在當前shell環境下進行的(de),程 序當然能找到環境變量,而系統自(zì)動執行任務調度時,是不會加載任何環境變量的(de),因此,就需要在crontab文件中指定任務運行所需的(de)所有環境變量,這 樣,系統執行任務調度時就沒有問題了。

不要假定cron知道(dào)所需要的(de)特殊環境,它其實并不知道(dào)。所以你要保證在shelll腳本中提供所有必要的(de)路徑和(hé)環境變量,除了一(yī)些自(zì)動設置的(de)全局變量。所以注意如(rú)下3點:

1)腳本中涉及文件路徑時寫全局路徑;

2)腳本執行要用到java或其他環境變量時,通過source命令引入環境變量,如(rú):

cat start_cbp.sh

#!/bin/sh

source /etc/profile

export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf

/usr/local/jboss-4.0.5/bin/run.sh -c mev &

3)當手動執行腳本OK,但是crontab死活不執行時。這時必須大膽懷疑是環境變量惹的(de)禍,并可(kě)以嘗試在crontab中直接引入環境變量解決問題。如(rú):

0 * * * * . /etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh

注意清理(lǐ)系統用戶的(de)郵件日志

每條任務調度執行完畢,系統都會将任務輸出信息通過電子(zǐ)郵件的(de)形式發送給當前系統用戶,這樣日積月累,日志信息會非常大,可(kě)能會影響系統的(de)正常運行,因此,将每條任務進行重定向處理(lǐ)非常重要。

例如(rú),可(kě)以在crontab文件中設置如(rú)下形式,忽略日志輸出:

0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1

“/dev/null 2>&1”表示先将标準輸出重定向到/dev/null,然後将标準錯誤重定向到标準輸出,由于标準輸出已經重定向到了/dev/null,因此标準錯誤也會重定向到/dev/null,這樣日志輸出問題就解決了。

系統級任務調度與用戶級任務調度

系 統級任務調度主要完成系統的(de)一(yī)些維護操作,用戶級任務調度主要完成用戶自(zì)定義的(de)一(yī)些任務,可(kě)以将用戶級任務調度放到系統級任務調度來完成(不建議這麽 做(zuò)),但是反過來卻不行,root用戶的(de)任務調度操作可(kě)以通過“crontab –uroot –e”來設置,也可(kě)以将調度任務直接寫入/etc /crontab文件,需要注意的(de)是,如(rú)果要定義一(yī)個定時重啓系統的(de)任務,就必須将任務放到/etc/crontab文件,即使在root用戶下創建一(yī)個 定時重啓系統的(de)任務也是無效的(de)。

 

其他注意事項

1、新創建的(de)cron job,不會馬上執行,至少要過2分鍾才執行。如(rú)果重啓cron則馬上執行。

2、當crontab突然失效時,可(kě)以嘗試/etc/init.d/crond restart解決問題。或者查看日志看某個job有沒有執行/報錯tail -f /var/log/cron。

3、千萬别亂運行crontab -r。它從Crontab目錄(/var/spool/cron)中删除用戶的(de)Crontab文件。删除了該用戶的(de)所有crontab都沒了。

4、在crontab中%是有特殊含義的(de),表示換行的(de)意思。如(rú)果要用的(de)話必須進行轉義\%,如(rú)經常用的(de)date ‘+%Y%m%d’在crontab裏是不會執行的(de),應該換成date ‘+\%Y\%m\%d’。