linux系統中的定時任務與兩部分組成,一部分是系統中自動的定時任務,叫做系統任務調度,另一種則是用戶自己寫的定時任務,叫做用戶任務調度,交給系統去執行。系統級任務調度主要完成系統的一些維護操作,用戶級任務調度主要完成用戶自定義的一些任務
系統任務調度:系統周期性所要執行的工作,比如寫緩存數據到硬盤、日志清理等。在/etc目錄下有一個crontab文件,這個就是系統任務調度的配置文件。
/etc/crontab文件包括下面幾行:
[root@localhost ~]# 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目錄中。其文件名與用戶名一致。它也分兩種,一種為一次性定時任務(at命令),另一個是周期性定時任務(crontab命令)。
關系圖如下:
今天我們主要講的是周期性的定時任務。
一.crond 介紹
crond 是linux系統中的用來執行周期性任務的守護進程,安裝時會默認安裝此進程,crond進程會每分鍾定期檢查是否有需要執行的任務,如果有,就自動執行該任務。
語法
crontab [ -u user ] file
或
crontab [ -u user ] { -l | -r | -e }
-u user 是指設定指定 user 的時程表,這個前提是你必須要有其權限(比如說是 root)才能夠指定他人的時程表。如果不使用 -u user 的話,就是表示設定自己的時程表。
參數說明:
- -e : 執行文字編輯器來設定時程表,內定的文字編輯器是 VI,如果你想用別的文字編輯器,則請先設定 VISUAL 環境變數來指定使用那個文字編輯器(比如說 setenv VISUAL joe)
- -r : 刪除目前的時程表
- -l : 列出目前的時程表
- -u user:用來設定某個用戶的crontab服務,例如,“-u ixdba”表示設定ixdba用戶的crontab服務,此參數一般有root用戶來運行。
時間格式如下:
f1 f2 f3 f4 f5 program
- 其中 f1 是表示分鍾,f2 表示小時,f3 表示一個月份中的第幾日,f4 表示月份,f5 表示一個星期中的第幾天。program 表示要執行的程序。
- 當 f1 為 * 時表示每分鍾都要執行 program,f2 為 * 時表示每小時都要執行程序,其餘類推
- 當 f1 為 a-b 時表示從第 a 分鍾到第 b 分鍾這段時間內要執行,f2 為 a-b 時表示從第 a 到第 b 小時都要執行,其餘類推
- 當 f1 為 */n 時表示每 n 分鍾個時間間隔執行一次,f2 為 */n 表示每 n 小時個時間間隔執行一次,其餘類推
- 當 f1 為 a, b, c,... 時表示第 a, b, c,... 分鍾要執行,f2 為 a, b, c,... 時表示第 a, b, c...個小時要執行,其餘類推
* * * * * - - - - - | | | | | | | | | +----- 星期中星期幾 (0 - 7) (星期天 為0) | | | +---------- 月份 (1 - 12) | | +--------------- 一個月中的第幾天 (1 - 31) | +-------------------- 小時 (0 - 23) +------------------------- 分鍾 (0 - 59)
使用者也可以將所有的設定先存放在文件中,用 crontab file 的方式來設定執行時間。
在以上各個字段中,還可以使用以下特殊字符:
星號(*):代表所有可能的值,例如month字段如果是星號,則表示在滿足其它字段的制約條件后每月都執行該命令操作。
逗號(,):可以用逗號隔開的值指定一個列表范圍,例如,“1,2,5,7,8,9”
中杠(-):可以用整數之間的中杠表示一個整數范圍,例如“2-6”表示“2,3,4,5,6”
正斜線(/):可以用正斜線指定時間的間隔頻率,例如“0-23/2”表示每兩小時執行一次。同時正斜線可以和星號一起使用,例如*/10,如果用在minute字段,表示每十分鍾執行一次。
二,實例
(00 23 * * *--每晚23時執行)
(00 17-19 * * * --每晚17-19時執行)
(*/5 * * * *--每隔五分鍾執行一次)
(30 3,12 * * *--每天凌晨三點半和中午12點半執行一次)
(30 8-18/2 * * * --早上八點半到下午六點半每隔兩個小時執行一次)
(45 4 1,10,22 * *--每月的1日10日22日的凌晨4點45分執行)
(10 1 * * 6,0—每周六周日的凌晨1點十分執行)
(* 23,00-07/1 * * *--每天23點,凌晨12點到早晨7點每小時每一分鍾執行一次)
(5月5號上午九點執行:00 09 05 05 *)
(每周日,上午9:30執行:30 09 * * 0)
注意:周和日不要同時用,否則可能達不到想要的效果
三. crontab定時任務生產應用問題7箴言
1、 系統環境變量問題
Crontab執行shell只能識別為數不多的系統環境變量,一般用戶定義的普通變量是無法識別的,如果在編寫腳本中需要使用這些變量,最好使用export重新聲明下該腳本才能正常執行。
2、 定時任務要用絕對路徑
Crontab執行shell時,如果shell路徑是相對路徑或者shell里含有的絕對路徑,此時 就會找不到文件。
3、 腳本權限問題加/bin/sh
要保證crontab的執行者有訪問shell腳本所在的目錄並且執行此shell腳本的權限,最佳的方法就是執行腳本前加/bin/sh,否則有可能因為忘了為腳本設定執行權限,而無法完成任務。
4、 時間變量問題用反斜線
“%”號在crontab任務配置中被認為是newline。需要用“\”來轉義。Crontab任務命令中,如果有“date+%Y%m%d”,必須替換為 “date+\%Y\%m\%d”
5、 >/dev/null2>&1問題
當定時任務在你所指定的時間執行,系統會寄信給你,顯示該程序執行的內容,若系統未開啟郵件服務就會導致郵件臨時目錄/var/spool/clientqueue碎文件件逐漸增加,wei此命令為了防止占滿inode.
6、 定時任務定時規范之前加注釋
寫定時任務加注釋,什么人物,什么時間,因為什么事,干了什么,都要記得清清楚楚。
7、 避免不必要的程序及命令的輸出
在開發定時任務程序和腳本時,在調試好腳本程序后,應盡量把DEBUG及命令輸出的內容信息屏蔽掉,如果需要,可指向到定時日志文件里,以避免多余的系統垃圾。