Linux 定時任務調度(crontab),太實用了!
概述
crontab命令用于設置周期性被執(zhí)行的指令。該命令從標準輸入設備讀取指令,并將其存放于“crontab”文件中,以供之后讀取和執(zhí)行。
可以使用crontab定時處理離線任務,比如每天凌晨2點更新數(shù)據等,經常用于系統(tǒng)任務調度。
服務啟動和關閉
一般Linux系統(tǒng)中都會裝有crontab,如果沒有安裝可以使用包管理工具安裝:
#?vixie-cron?軟件包是?cron?的主程序
yum?-y?install?vixie-cron
yum?-y?install?crontabs
crontab服務的啟動和關閉命令如下:
service?crond?start?????#?啟動服務
service?crond?stop??????#?關閉服務
service?crond?restart???#?重啟服務
service?crond?reload????#?重新載入配置
service?crond?status????#?查看crontab服務狀態(tài)
#?可以使用下面的命令加入開機啟動
chkconfig?--level?345?crond?on
任務調度全局配置
crontab全局任務調度配置在如下的目錄:
cron.d/???????
cron.daily/???
cron.deny?????
cron.hourly/??
cron.monthly/?
crontab???????
cron.weekly/
cron.daily是每天執(zhí)行一次的jobcron.weekly是每個星期執(zhí)行一次的jobcron.monthly是每月執(zhí)行一次的jobcron.hourly是每個小時執(zhí)行一次的jobcron.d是系統(tǒng)自動定期需要做的任務crontab是設定定時任務執(zhí)行文件cron.deny文件就是用于控制不讓哪些用戶使用Crontab的功能
用戶配置文件
每個用戶都有自己的crontab配置文件,使用crontab -e命令進行編輯。保存后系統(tǒng)會自動存放與/var/spool/cron/目錄中,文件以用戶名命名。
linux的crontab服務每隔一分鐘去讀取一次/var/spool/cron,/etc/crontab,/etc/cron.d下面所有的內容。另外,Linux 系列面試題和答案我都整理好了,關注公眾號Java技術棧,回復:面試,可以在線閱讀。
crontab命令一覽:
crontab -e: 編輯當前用戶的定時任務列表crontab -l: 查看當前用戶的定時任務列表crontab -r: 刪除當前用戶的定時任務列表
crontab定時任務格式
crontab每一條記錄為一個定時任務,定時人遵循相應的定義規(guī)則。

其中前面的6個星號表示的含義如下:
minute:表示分鐘,可以是從0到59之間的任何整數(shù)。hour:表示小時,可以是從0到23之間的任何整數(shù)。day:表示日期,可以是從1到31之間的任何整數(shù)。month:表示月份,可以是從1到12之間的任何整數(shù)。week:表示星期幾,可以是從0到7之間的任何整數(shù),這里的0或7代表星期日。command:要執(zhí)行的命令,可以是系統(tǒng)命令,也可以是自己編寫的腳本文件。
每一個星號部分可用下面的特殊符號:
星號(*):通配符匹配,代表所有可能的值。 逗號(,):可以用逗號隔開的值指定一個列表范圍,例如,“1,2,5,7,8,9”。 中杠(-):可以用整數(shù)之間的中杠表示一個整數(shù)范圍,例如“2-6”表示“2,3,4,5,6”。 正斜線(/):可以用正斜線指定時間的間隔頻率,例如“0-23/2”表示每兩小時執(zhí)行一次。同時正斜線可以和星號一起使用,例如*/10,如果用在minute字段,表示每十分鐘執(zhí)行一次。
crontab定時任務實例
時間頻次示例
下面列舉常用的時間頻次示例。
00 05 * * * : 每天凌晨5點執(zhí)行 20 12 1,10,20 * * : 每個月的1號,10號,20號的12:30執(zhí)行 10 1 * * 6,0 : 表示每周六、周日的1:10分執(zhí)行 0,30 18-23 * * * : 每天18:00至23:00之間每隔30分鐘執(zhí)行 0 23-7/1 * * * : 晚上11點到早上7點之間,每隔一小時執(zhí)行 0 6-12/3 * 10 * : 每年10月的每天早上6點到12點每隔3個小時執(zhí)行一次 30 17 * * 1-5 : 周一到周五下午5點30分執(zhí)行一次 0 */2 * * * :每兩個小時執(zhí)行一次
比如我們需要每天23點58分的時候執(zhí)行一個更新數(shù)據的shell腳本,可以用crontab -e命令在最后添加一行:
58?23?*?*?*?sh?/home/work/update.sh
輸入輸出重定向
在上面更新數(shù)據定時任務的實例中,如果執(zhí)行update.sh的時候有錯誤信息輸出,會輸出到哪兒呢?
在沒有配置輸出重定向的時候,定時任務會見錯誤輸出到下面的文件:/var/log/mail/{$user},這是很不好的,我們往往需要把不同的腳本輸出到不同的日志文件,方便查看腳本的執(zhí)行情況,這個時候需要使用輸出重定向。
58?23?*?*?*?sh?/home/work/update.sh?>>?/home/work/log/update.log?2>&1
Linux中使用0-3作為文件描述符來表示標準流。
| 名稱 | 類型 | 文件描述符 | 操作 |
|---|---|---|---|
| stdin 標準輸入 | standard input | 0 | <,<< |
| stdout 標準輸出 | standard output | 1 | >,>> |
| stderr 標準錯誤輸出 | standard error output | 2 | 2>,2>> |
在上面的定時任務腳本中,update.sh后面的>>表示將輸出追加到update.log文件中,2>&1表示標準錯誤輸出重定向等同于標準輸出。
推薦閱讀:Linux 知識大全。
忽略輸入nohup
有時候我們還會看到在定時任務腳本前面有一個nohup的命令,該命令用于指定后面的腳本忽略輸入。
58?23?*?*?*?nohup?sh?/home/work/update.sh?>>?/home/work/log/update.log?2>&1
后臺執(zhí)行&
無論是在控制臺直接執(zhí)行,還是在定時任務腳本中,我們在某一條命令的最后面加上&符號,表示當前命令在后臺運行,不占用控制臺。
58?23?*?*?*?nohup?sh?/home/work/update.sh?>>?/home/work/log/update.log?2>&1?&
這里需要注意,如果執(zhí)行的命令有等待輸入的交互,把這個命令使用&放在后臺運行時,它會一直等待輸入,但是有沒有輸入,就卡住不動了。
時間處理
再回顧上面的更新任務,它是將每一天的運行結果都重定向到update.log文件,如果輸出比較多,我們就需要每一天輸出的不同的文件,可以通過在輸出目錄中指定日期用來分割。如下:
58?23?*?*?*?nohup?sh?/home/work/update.sh?>>?/home/work/log/`update_"date?+\%Y\%m\%d".log`?2>&1?&
#?或者下面的形式
58?23?*?*?*?nohup?sh?/home/work/update.sh?>>?"/home/work/log/update_"date?+\%Y\%m\%d".log"?2>&1?&
這里使用date函數(shù),需要注意的是,crontab里面的腳本命令和直接在命令行運行的腳本可能是不一樣的,尤其是date函數(shù)中的%需要轉義。
可以直接在命令行運行下面命令:
sh?/home/work/update.sh?>>?/home/work/log/update_`date?+"%Y%m%d".log`?2>&1?&
達到和定時任務里面相同的效果,都是輸出到update_20201120.log的文件。
但是如果直接在crontab中這樣配置,則無法識別,不會執(zhí)行該定時任務。下面的crontab任務是不會執(zhí)行的,date函數(shù)將會報錯。
58?23?*?*?*?nohup?sh?/home/work/update.sh?>>?/home/work/log/`update_"date?+%Y%m%d".log`?2>&1?&
作者:悠悠
來源:http://uusama.com/827.html

數(shù)據前線
后臺回復關鍵字:1024,獲取一份精心整理的技術干貨 后臺回復關鍵字:進群,帶你進入高手如云的交流群。 推薦閱讀

