概述:什麼是計劃任務呢?就像我們每個人日常生活中都會使用到的鬧鐘一樣,按時的去提醒該幹什麼事,以免忘記。同樣,我們在工作中也要每天在特定的時間內安排一些事情,這就是計劃任務。
未來的某時間點執行以此任務:at,batch
週期性運行某任務:cron
at命令
用法:at [option] TIME
TIME:
HH:MM [YYYY-mm-dd]
noon, midnight, teatime
tomorrow
now+#{minutes,hours,days,OR weeks}
示例:
(1)HH:MM 如 02:00
在今天的02:00進行,若該時刻已過,則明天此時執行任務
(2)HH:MM YYYY——MM——DD 如:04:00 2016-09-20
規定在某年某月的某一天的特殊時可進行該項任務
(3)HH:MM[am|pm] [Month] [DATE]
04pm March 17 17:20 tomorrow
(4)HH:MM[am|pm]+number[minutes|hours|days|weeks]
在某個時間點再加及各時間後才執行該項任務
now+5minutes 03pm+3days
常用選項:
-q QUEUE:指明隊列;
-l:列出指定隊列中等待運行的作業;相當於atq
-d:刪除指定的作業;相當於atrm
-c:查看具體作業任務
-f /path/from/somefile:從指定的文件中讀取任務;
-m :強制at發送郵件,表示執行完畢;
注意:作業的執行結果中的標準輸出和錯誤輸出以郵件形式通知給相關用戶;
batch命令
讓系統自行選擇空閒時間去執行此處指定的任務;
週期性任務計劃:cron
向crond提交作業的方式不同於at,它需要使用專門的配置文件,此文件有固定格式,不建議使用文本編輯器直接編輯此文件,要使用crontab命令,可以檢查語法是否有錯誤。
相關的程序包
cronie:主程序包,提供了crond守護進程及相關輔助工具;
cronie-anacron:cronie的補充程序,用於監控cronie任務執行狀況;如cronie
中任務在過去該運行的時間點未能正常運行,則anacron會隨後啓動一次此任務;
crontabs:包含Centos提供系統維護任務;
確保crond守護處於運行狀態:
CentOS 7: systemctl status crond
CentOS 6: service crond status
計劃要週期性執行的任務提交給crond,由其來實現到點運行。
系統cron任務:系統維護作業 手動編輯/etc/crontab
用戶cron任務:crontab命令
系統cron任務
[root@server1 yum.repos.d]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin #注意命令路徑
MAILTO=root
HOME=/
# For details see 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
* * * * *:定義週期性時間;
user-name:運行任務的用戶身份;
command to be executed:要執行的任務
此處的環境變量不同於用戶登錄後獲得的環境變量,因此,建議命令使用絕對路徑。
例如:晚上9點10分運行echo命令:
10 21 * * * gentoo /bin/echo “Hello“
時間表示法:
(1)特定值:給丁時間點有效取之範圍內的值;
(2) * :給定時間上有效取值範圍內的所有值;表示“每。。。“
(3)離散取值:, #,#,#
(4)連續取值:- #-#
(5)指定時間範圍上,定義步長: /#:#即步長
例如:每3小時echo命令
0 */3 * * * gentoo /bin/echo “hello“
用戶cron
crontab命令定義,每個用戶都有專用的cron任務文件:/var/spool/cron/USERNAME
crontab [-u user] [-l | -r | -e] [-i]
-l: 列出所有任務;
-e: 編輯任務;
-r: 移除所有任務;
-i: 同-r一起用,以交互式模式讓用戶有選擇的移除指定任務;
-u user:僅root可運行,代爲爲指定用戶管理cron任務;
注意:運行結果以又見通知給相關用戶:
(1) COMMAND > /dev/null
(2) COMMAND &> /dev/null
對於cron任務來講,%有特殊用途;如果要在命令中使用%,則需要轉義;
不過,如果把%放置於單引號中,也可以不用轉義。
思考:(1)如何實現秒級別運行任務?
* * * * * for min in 0 1 2; do echo "hi"; sleep 20; done
(2)如何實現每7分鐘運行一次任務?
sleep命令: sleep NUMBER[SUFFIX]...
SUFFIX:s:秒,默認 m:分鐘 h:小時 d:天
練習:
1 每小時備份一次/etc目錄至/backup目錄中,保存的文件名稱格式爲“etc-yyyy-mm-dd-HH.tar.xz“;
0 * * * * /bin/tar -czf /backup/etc-date +%F-%H
.tar.gz /etc &> /dev/null
2 每週2,4,7備份/var/log/messagees文件至/logs目錄中,文件名型如“messages-yyyymmdd“;
0 0 * * 2,4,7 /bin/cp -a /var/log/messages /logs/messages-date +%Y%m%d
&>/dev/null
3 每兩個小時取出當前系統/proc/meminfo文件中以S或者M開頭的信息追加至/tmp/meminfo.txt文件中;
0 /2 * * /bin/grep ‘^[SM]’ /proc/meminfo >> /tmp/meminfo.txt
4 工作日時間內,每小時執行一次“ip addr ahow“命令;
0 * * * 1-5 /sbin/ip addr show