1. 程式人生 > >Linux下的計劃任務:crontab命令詳解

Linux下的計劃任務:crontab命令詳解

前一天學習了 at 命令是針對僅執行一次的任務,迴圈執行的例行性計劃任務,linux系統則是由 cron (crond) 這個系統服務來控制的。Linux 系統上面原本就有非常多的計劃性工作,因此這個系統服務是預設啟動的。另外, 由於使用者自己也可以設定計劃任務,所以, Linux 系統也提供了使用者控制計劃任務的命令 :crontab 命令。

一、crond簡介

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

Linux下的任務排程分為兩類,系統任務排程和使用者任務排程。

系統任務排程:系統週期性所要執行的工作,比如寫快取資料到硬碟、日誌清理等。在/etc目錄下有一個crontab檔案,這個就是系統任務排程的配置檔案。

/etc/crontab檔案包括下面幾行:

[[email protected] ~]# 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

[root@localhost ~]#

前四行是用來配置crond任務執行的環境變數,第一行SHELL變數指定了系統要使用哪個shell,這裡是bash,第二行PATH變數指定了系統執行命令的路徑,第三行MAILTO變數指定了crond的任務執行資訊將通過電子郵件傳送給root使用者,如果MAILTO變數的值為空,則表示不傳送任務執行資訊給使用者,第四行的HOME變數指定了在執行命令或者指令碼時使用的主目錄。第六至九行表示的含義將在下個小節詳細講述。這裡不在多說。

使用者任務排程:使用者定期要執行的工作,比如使用者資料備份、定時郵件提醒等。使用者可以使用 crontab 工具來定製自己的計劃任務。所有使用者定義的crontab 檔案都被儲存在 /var/spool/cron目錄中。其檔名與使用者名稱一致。

使用者許可權檔案

檔案:

/etc/cron.deny

說明:

該檔案中所列使用者不允許使用crontab命令

檔案:

/etc/cron.allow

說明:

該檔案中所列使用者允許使用crontab命令

檔案:

/var/spool/cron/

說明:

所有使用者crontab檔案存放的目錄,以使用者名稱命名

crontab檔案的含義:

使用者所建立的crontab檔案中,每一行都代表一項任務,每行的每個欄位代表一項設定,它的格式共分為六個欄位,前五段是時間設定段,第六段是要執行的命令段,格式如下:

minute   hour   day   month   week   command

其中:

minute: 表示分鐘,可以是從0到59之間的任何整數。

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

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

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

week:表示星期幾,可以是從0到7之間的任何整數,這裡的0或7代表星期日。

command:要執行的命令,可以是系統命令,也可以是自己編寫的指令碼檔案。

 

在以上各個欄位中,還可以使用以下特殊字元:

星號(*):代表所有可能的值,例如month欄位如果是星號,則表示在滿足其它欄位的制約條件後每月都執行該命令操作。

逗號(,):可以用逗號隔開的值指定一個列表範圍,例如,“1,2,5,7,8,9”

中槓(-):可以用整數之間的中槓表示一個整數範圍,例如“2-6”表示“2,3,4,5,6”

正斜線(/):可以用正斜線指定時間的間隔頻率,例如“0-23/2”表示每兩小時執行一次。同時正斜線可以和星號一起使用,例如*/10,如果用在minute欄位,表示每十分鐘執行一次。

二、crond服務

安裝crontab

yum install crontabs

服務操作說明:

/sbin/service crond start //啟動服務

/sbin/service crond stop //關閉服務

/sbin/service crond restart //重啟服務

/sbin/service crond reload //重新載入配置

檢視crontab服務狀態:

service crond status

手動啟動crontab服務:

service crond start

檢視crontab服務是否已設定為開機啟動,執行命令:

ntsysv

加入開機自動啟動

chkconfig –level 35 crond on

三、crontab命令詳解

1.命令格式:

crontab [-u user] file

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

2.命令功能:

通過crontab 命令,我們可以在固定的間隔時間執行指定的系統指令或 shell script指令碼。時間間隔的單位可以是分鐘、小時、日、月、周及以上的任意組合。這個命令非常設合週期性的日誌分析或資料備份等工作。

3.命令引數:

-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.常用方法:

1). 建立一個新的crontab檔案

在考慮向cron程序提交一個crontab檔案之前,首先要做的一件事情就是設定環境變數EDITOR。cron程序根據它來確定使用哪個編輯器編輯crontab檔案。9 9 %的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/echo 'date' > /dev/console

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

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

$ crontab davecron

現在該檔案已經提交給cron程序,它將每隔1 5分鐘執行一次。

同時,新建立檔案的一個副本已經被放在/var/spool/cron目錄中,檔名就是使用者名稱(即dave)。

2). 列出crontab檔案

   為了列出crontab檔案,可以用:

$ crontab -l

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

你將會看到和上面類似的內容。可以使用這種方法在$ H O M E目錄中對crontab檔案做一備份:

$ crontab -l > $HOME/mycron

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

3). 編輯crontab檔案

   如果希望新增、刪除或編輯crontab檔案中的條目,而E D I TO R環境變數又設定為v i,那麼就可以用v i來編輯crontab檔案,相應的命令為:

$ crontab -e

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

我們在編輯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檔案,假設你在自己的$ H O M E目錄下還有一個備份,那麼可以將其拷貝到/var/spool/cron/<username>,其中<username>是使用者名稱。如果由於許可權問題無法完成拷貝,可以用:

$ crontab <filename>

    其中,<filename>是你在$ H O M E目錄中副本的檔名。

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

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

5.使用例項

例項1:每1分鐘執行一次command

命令:

* * * * * command

例項2:每小時的第3和第15分鐘執行

命令:

3,15 * * * * command

例項3:在上午8點到11點的第3和第15分鐘執行

命令:

3,15 8-11 * * * command

例項4:每隔兩天的上午8點到11點的第3和第15分鐘執行

命令:

3,15 8-11 */2 * * command

例項5:每個星期一的上午8點到11點的第3和第15分鐘執行

命令:

3,15 8-11 * * 1 command

例項6:每晚的21:30重啟smb 

命令:

30 21 * * * /etc/init.d/smb restart

例項7:每月1、10、22日的4 : 45重啟smb 

命令:

45 4 1,10,22 * * /etc/init.d/smb restart

例項8:每週六、週日的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:每星期六的晚上11 : 00 pm重啟smb 

命令:

0 23 * * 6 /etc/init.d/smb restart

例項11:每一小時重啟smb 

命令:

* */1 * * * /etc/init.d/smb restart

例項12:晚上11點到早上7點之間,每隔一小時重啟smb 

命令:

* 23-7/1 * * * /etc/init.d/smb restart

例項13每月的4號與每週一到週三的11點重啟smb 

命令:

0 11 4 * mon-wed /etc/init.d/smb restart

例項14:一月一號的4點重啟smb 

命令:

0 4 1 jan * /etc/init.d/smb restart

例項15:每小時執行/etc/cron.hourly目錄內的指令碼

命令:

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

說明:

run-parts這個引數了,如果去掉這個引數的話,後面就可以寫要執行的某個指令碼名,而不是目錄名了

四、使用注意事項

1. 注意環境變數問題

有時我們建立了一個crontab,但是這個任務卻無法自動執行,而手動執行這個任務卻沒有問題,這種情況一般是由於在crontab檔案中沒有配置環境變數引起的。

在crontab檔案中定義多個排程任務時,需要特別注意的一個問題就是環境變數的設定,因為我們手動執行某個任務時,是在當前shell環境下進行的,程式當然能找到環境變數,而系統自動執行任務排程時,是不會載入任何環境變數的,因此,就需要在crontab檔案中指定任務執行所需的所有環境變數,這樣,系統執行任務排程時就沒有問題了。

不要假定cron知道所需要的特殊環境,它其實並不知道。所以你要保證在shelll指令碼中提供所有必要的路徑和環境變數,除了一些自動設定的全域性變數。所以注意如下3點:

1)指令碼中涉及檔案路徑時寫全域性路徑;

2)指令碼執行要用到java或其他環境變數時,通過source命令引入環境變數,如:

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死活不執行時。這時必須大膽懷疑是環境變數惹的禍,並可以嘗試在crontab中直接引入環境變數解決問題。如:

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

2. 注意清理系統使用者的郵件日誌

每條任務排程執行完畢,系統都會將任務輸出資訊通過電子郵件的形式傳送給當前系統使用者,這樣日積月累,日誌資訊會非常大,可能會影響系統的正常執行,因此,將每條任務進行重定向處理非常重要。

例如,可以在crontab檔案中設定如下形式,忽略日誌輸出:

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

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

3. 系統級任務排程與使用者級任務排程

系統級任務排程主要完成系統的一些維護操作,使用者級任務排程主要完成使用者自定義的一些任務,可以將使用者級任務排程放到系統級任務排程來完成(不建議這麼做),但是反過來卻不行,root使用者的任務排程操作可以通過“crontab –uroot –e”來設定,也可以將排程任務直接寫入/etc/crontab檔案,需要注意的是,如果要定義一個定時重啟系統的任務,就必須將任務放到/etc/crontab檔案,即使在root使用者下建立一個定時重啟系統的任務也是無效的。

4. 其他注意事項

新建立的cron job,不會馬上執行,至少要過2分鐘才執行。如果重啟cron則馬上執行。

當crontab突然失效時,可以嘗試/etc/init.d/crond restart解決問題。或者檢視日誌看某個job有沒有執行/報錯tail -f /var/log/cron。

千萬別亂執行crontab -r。它從Crontab目錄(/var/spool/cron)中刪除使用者的Crontab檔案。刪除了該使用者的所有crontab都沒了。

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

原文地址:http://www.cnblogs.com/peida/archive/2013/01/08/2850483.html

相關推薦

Linux計劃任務crontab命令

前一天學習了 at 命令是針對僅執行一次的任務,迴圈執行的例行性計劃任務,linux系統則是由 cron (crond) 這個系統服務來控制的。Linux 系統上面原本就有非常多的計劃性工作,因此這個系統服務是預設啟動的。另外, 由於使用者自己也可以設定計劃任務,所以, Linux 系統也提供了使用者控制

Linux的壓縮zip,tar命令及例項

Linux下的壓縮解壓縮命令詳解及例項 例項:壓縮伺服器上當前目錄的內容為xxx.zip檔案 zip -r xxx.zip ./* 解壓zip檔案到當前目錄 unzip filename.zip ============================ 另:有些伺服器

.Neter玩轉Linux系列之五crontab使用Linux的程序管理以及網路狀態監控

基礎篇 實戰篇 一、crontab使用詳解  概述:任務排程:是指系統在某個時間執行的特定的命令或程式。 任務排程分類:       (1)系統工作:有些重要的工作必須周而 復始地執行。       (2)個別使用者工作:個別使用者可能希望執 行某些程式。

LinuxLinux定時任務Crontab命令

星期幾 ima 默認 定時 最好 表示 時間 path 配置文件 linux 系統則是由 cron (crond) 這個系統服務來控制的。Linux 系統上面原本就有非常多的計劃性工作,因此這個系統服務是默認啟動的。另 外, 由於使用者自己也可以設置計劃任務,所以, Lin

Linux定時任務Crontab命令

自動 monthly ons 命名 維護 我們 周期 你在 腳本文件 linux 系統則是由 cron (crond) 這個系統服務來控制的。Linux 系統上面原本就有非常多的計劃性工作,因此這個系統服務是默認啟動的。另 外, 由於使用者自己也可以設置計劃任務,所以, L

Linux系統中定時任務cron和crontab命令與配置規則說明

cron機制         cron可以讓系統在指定的時間,去執行某個指定的工作,我們可以使用crontab指令來管理cron機制 crontab引數         -u:這個引數可以讓我們去編輯其他人的crontab,如果沒有加上這個引數的話就會開啟自己的crontab

【轉】Linux定時任務Crontab命令

本文轉自:https://www.cnblogs.com/intval/p/5763929.html linux 系統則是由 cron (crond) 這個系統服務來控制的。Linux 系統上面原本就有非常多的計劃性工作,因此這個系統服務是預設啟動的。另 外, 由於使用者自己也可以

Linuxat命令

計時 osi 執行 inux days pan 必須 man 一個 at命令 at命令為單一工作調度命令。at命令非常簡單,但是在指定時間上卻非常強大 語法 at [選項] time at > 執行的命令 ctrl+d 選項 -m :當指定的任務被

Linux crontab命令

條件 nta mman minute 使用 1-1 同時 刪除用戶 設置 1.crontab命令概覽      命令參數:   -u user:用來設定某個用戶的crontab服務,例如,“-u ixdba”表示設定ixdba用戶的crontab服務,此參數一般有root用

linux計劃任務

方案 使用 介紹 com windows lin 方法 http 分組 小夥伴們,平時做程序開發的時候,是否也曾為實現一個商城網站或者一個小程序自動執行某個方法而苦惱呢?今天思夢php就給大家帶了這個解決的方案,當然這個有很多種的方法去實現,而今天小編給大家講解是配置Lin

Linux系統python學習筆記——Linux中檔案和目錄常用命令

一、檢視目錄內容 ls命令說明: 英文單詞list的簡寫,功能為列出目錄的內容,是使用者最常用的命令字義    Linux下檔案和目錄的特點: Linux檔案或目錄名稱最長可以有256個字元 以 . 開頭的檔案為隱藏檔案,需要用-a引數才能顯示(all

Linuxecho命令

echo命令 用於字串的輸出 格式 echo string 使用echo實現更復雜的輸出格式控制 1.顯示普通字串: echo "It is a test" 這裡的雙引號完全可以省略,以下命令與上面例項效果一致: echo It i

LinuxPS命令與使用

  要對程序進行監測和控制,首先必須要了解當前程序的情況,也就是需要檢視當前程序,ps命令就是最基本程序檢視命令。使用該命令可以確定有哪些程序正在執行和執行的狀態、程序是否結束、程序有沒有殭屍、哪些程序佔用了過多的資源等等.總之大部分資訊都是可以通過執行該命令得到。ps是

定時任務 Crontab命令

前言 crontab是Unix和Linux用於設定週期性被執行的指令,是網際網路很常用的技術,很多工都會設定在crontab迴圈執行,如果不使用crontab,那麼任務就是常駐程式,這對你的程式要求比較高,一個要求你的程式是24X7小時不宕機,一個是 要求你的排

Linuxawk命令

http://zhangge.net/1939.html 簡單使用: awk :對於檔案中一行行的獨處來執行操作 。 awk -F :'{print $1,$4}'   :使用‘:’來分割這一行,把這一行的第一第四個域打印出來 。

Linux / Mac 基本的 bash shell 命令(touch 、cp、mv、rm)

前言 這一篇主要說了touch,cp,mv,rm這幾個很基本常用的命令。部落格會同時釋出在簡書和CSDN,希望大家支援。 處理檔案 bash shell 提供了很多在Linux檔案系統上操作檔案的命令。 建立檔案 touch 可以使用touch

linux文字處理三劍客(三)awk命令

簡介 awk是一個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。 awk有3個不同版本: awk、nawk和gaw

Linux同步工具inotify+rsync使用

server linux 通道 主機 Linux下同步工具inotify+rsync使用詳解 Posted on 2014-12-12 | In Linux | 9 | Visitors 4381. rsync1.1 什麽是rsyncrsync是一個遠程數據同步工具,可通過LAN/WAN

Linux PS1 PS2 PS3 PS4 提示符

linux提示符很多人在用Linux時,對提示符都不太註重,能夠利用好提示符可更直觀地查看,利於自己的判斷Linux下有PS1 PS2 PS3 PS4 四類提示符,這四個變量都是環境變量,至於系統裏有哪些環境變量,可使用命令 “env”來查看PS1命令提示符PS1有那些配置,或者說PS1裏頭都能配置些命令提示

Linux系統開機啟動項優化 命令 齊天大聖原創作品 命令來自老男孩教育

開機啟動優化Linux系統開機啟動項優化 命令詳解 齊天大聖原創作品 命令來自老男孩教育