Linux任務計劃
什麼是任務計劃呢?就像咱們每一個人平常生活中都會使用到的鬧鐘同樣,按時的去提醒該去作什麼事情,以避免忘記。一樣,咱們在工做當中也要在天天在特定的時間內安排作一些事情,這就是任務計劃,本章將學習如何制定Linux系統的任務計劃,這裏主要包括兩種工具:at 和 crontab
將來的某時間點執行一次任務:at、batch
週期性運行某任務:croncentos
電子郵件服務:
smtp:simple mail transmission protocol,簡單郵件傳輸協議,用於傳送郵件
pop3:Post Office Protocol,郵局協議
imap4:Internet Mail Access Protocol,互聯網郵件訪問協議併發
mailx - send and receive Internet mail
MUA:Mail User Agent
使用mail命令發送郵件
mailx [-s 'Subject'] username[@hostname]
郵件正文的生成:
一、直接編輯,經過Ctrl+d結束郵件編輯併發送
mail -s 'Hello' king@localhost
二、經過文件輸入重定向
mail -s 'Hello' king@localhost < Mail_File
三、經過管道;
echo -e "How are you?" | mail -s 'Hello' king@localhost工具
at命令:某時間點執行一次任務
at是由atd提供服務的,在使用以前要確認是否開啓
CentOS 6:service atd {status|start}
CentOS 7:systemctl {status|start} atd學習
at [option] TIME
TIME格式:
規定在某年某月的某一天的某個時間點執行該任務
HH:MM [YYYY-mm-dd]
noon, midnight, teatime,tomorrow
在某個時間點事後多長時間執行該任務
now+#{minutes,hours,days, weeks}
經常使用選項:
-q QUEUE 查詢指定任務隊列(默認只有一個隊列a)
-l 列出指定隊列中等待運行的做業;至關於atq命令
-d 刪除指定的做業;至關於atrm命令
-c 查看具體做業任務
-f /path/from/somefile 從指定的文件中讀取任務
-m 強制at發送郵件,表示執行完畢
注意:做業執行命令的結果中的標準輸出和錯誤以郵件通知給相關用戶centos7
執行方式:交互式、輸入重定向、at –f 文件;依賴於atd服務,須要該啓動才能實現at任務
at隊列存放在/var/spool/at目錄中;/etc/at.{allow,deny}控制用戶是否能執行at任務
白名單:/etc/at.allow 默認不存在,當at.allow存在時只有該文件中的用戶才能執行at命令,不在此文件的用戶不容許
黑名單:/etc/at.deny 默認存在,拒絕該文件中用戶執行at命令,而沒有在at.deny 文件中的使用者則可執行
若是兩個文件都存在時,at.allow的優先級高;若是兩個文件都不存在,只有 root 能夠執行 at 命令spa
示例:
HH:MM 如:02:00
在今日的HH:MM 進行,若該時刻已過,則明天此時執行任務隊列
HH:MM YYYY-MM-DD 如:04:00 2016-09-20
規定在某年某月的某一天的特殊時刻進行該項任務進程
HH:MM[am|pm] [Month] [Date]
04pm March 17
17:20 tomorrowcrontab
HH:MM[am|pm] + number [minutes|hours|days|weeks]
在某個時間點再加幾個時間後才進行該項任務
如:now + 5 minutes
04pm + 3 daysip
演示:
# 設定計劃任務,在2分鐘後執行
[root@centos7 ~]# at now+2min
at> cat /etc/issue
at> ls /var
at> echo "hello there."
at> <EOT> # 按 Ctrl+d 提交
job 1 at Fri Feb 24 15:49:00 2017
# 查看計劃任務
[root@centos7 ~]# at -l
1 Fri Feb 24 15:49:00 2017 a root
# 從指定文件中讀取任務,不在交互式輸入
[root@centos7 ~]# at -f at.tasks now+5min
job 2 at Fri Feb 24 16:08:00 2017
[root@centos7 ~]# at -l
2 Fri Feb 24 16:08:00 2017 a root
[root@centos7 ~]# atq
2 Fri Feb 24 16:08:00 2017 a root
# 指明任務編號,刪除任務 至關於atrm
[root@centos7 ~]# at -d 2
[root@centos7 ~]# atq
[root@centos7 ~]# at -f at.tasks now+5min
job 3 at Fri Feb 24 16:09:00 2017
[root@centos7 ~]# atq
3 Fri Feb 24 16:09:00 2017 a root
[root@centos7 ~]# atrm 3
[root@centos7 ~]# atq
batch命令:讓系統自行選擇空閒時間(CPU負載小於0.8的時候)去執行此處指定的任務;
cron週期性任務計劃:
相關的程序包:
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任務/etc/crontab
# 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
例如:晚上9點10分運行echo命令;
10 21 * * * gentoo /bin/echo "Howdy!"
時間表示法:
一、特定值:給定時間點有效取值範圍內的值
示例:
3 * * * *:每小時執行一次,每小時的第三分鐘
3 4 * * 5:每週執行一次,每週五的4點3分
5 6 7 * *:每個月執性一次,每個月的7號6點5分
7 8 9 10 *:每一年執行一次,每一年的10月9號8點7分
二、*:給定時間點上有效取值範圍內的全部值;表示"每"
三、離散取值:#,#,#
示例:
9 8 * * 3,7:每週三和週日的8點9分
0 8,20 * * 3,7:每週三和週日的8點和20點
四、連續取值:#-#
示例:
0 9-18 * * 1-5:週一到週五(工做時間)內的每小時執行
五、在指定時間範圍上,定義步長:/# #即爲步長
示例:
0 */3 * * *:每3小時執行一次任務
*/5 * * * *:每5分鐘執行一次任務
注意:
指定的時間點不能被步長整除時,其意義將不復存在
最小時間單位爲"分鐘",想完成"秒"級任務,的須要額外借助其它機制(定義成每分鐘任務,而再利用腳本實現每分鐘以內,循環執行屢次)
用戶cron任務:
crontab命令定義,每一個用戶都有專用的cron任務文件:/var/spool/cron/USERNAME
crontab命令:crontab [-u user] [-l | -r | -e] [-i]
-l 列出全部任務
-e 編輯任務
-r 移除全部任務
-i 同-r一同使用,以交互式模式讓用戶有選擇地移除指定任務
-u user 僅root可運行,爲指定用戶管理cron任務
cron 執行的每一項工做都會被紀錄到/var/log/cron
注意:運行結果以郵件通知給相關用戶;也能夠將命令執行結果重定向
COMMAND > /dev/null
COMMAND &> /dev/null
對於cron任務來說,%有特殊用途;若是在命令中要使用%,則須要轉義;也能夠把%放置於單引號中就不須要轉義;
如何在秒級別運行任務?
* * * * * for min in 0 1 2; do echo "hi"; sleep 20; done
sleep命令:
sleep Number[SUFFIX]...
SUFFIX:
s 秒(默認)
m 分
h 小時
d 天
案例:
每4小時備份一次/etc目錄至/backup目錄中,保存的文件名稱格式爲「etc-yyyy-mm-dd-HH」
# mkdir /backup
# crontab -e
0 */4 * * * /bin/cp -a /etc /backup/etc-`date + '%F-%H'` > /dev/null
每週2, 4, 7備份/var/log/messages文件至/logs目錄中,文件名形如「messages-yyyymmdd」
# mkdir /logs
# crontab -e
# 20 1 * * 2,4,0 /bin/cp -a /var/log/messages /logs/messages-`date +'%Y%m%d'` > /dev/null
每兩小時取出當前系統/proc/meminfo文件中以S或M開頭的信息追加至/tmp/meminfo.txt文件中
# crontab -e
# 0 */2 * * * /bin/grep -e '^S' -e '^M' /proc/meminfo >> /tmp/meminfo.txt
工做日時間內,每兩小時執行一次「ip addr show」命令
# crontab -e
# 0 9-17/2 * * 1-5 /sbin/ip addr show