Linux任務計劃、周期性任務執行
內容簡要命令:mail,
定時執行shell腳本,at, crontab
相信每個人都有使用鬧鐘的習慣,我們設定鬧鐘的種類有很多。比如說,只提醒一次、工作日提醒、休息日提醒等。在設定鬧鐘之后,每天的設定時間都會按時的提醒你去做什么事情,以免自己忘記一些重要的會議等事情。像這樣在每天特定的時間安排做一些事情。這樣一種事情我們就稱之為例行任務計劃。
其實在個系統平臺上都有類似的例行性任務計劃功能,那如何去像設定鬧鐘一樣在Linux系統之上指定例行性任務計劃。
crontab執行shell命令,我們先來看看任務計劃的分類:主要有兩種
一次性任務計劃:未來的某時間點執行一次某任務:at, batch:只執行一次就結束
周期性任務計劃:周期性運行某任務:crontab:每隔一定時間就去做相同的事情
shell腳本定時任務。執行結果:會通過郵件發送給用戶
~]# ?netstat
-tnlp
redis定時任務、~]# ss -tnl
本地電子郵件服務:
smtp:simple
shell 定時任務、mail transmission protocol
pop3:Post
Office Procotol
imap4:Internet Mail Access Procotol
mail命令:
mailx - send
and receive Internet mail
MUA:Mail
User Agent, 用戶收發郵件的工具程序;
r:回復
d: 刪除
mailx
[-s 'SUBJECT']
username[@hostname]
郵件正文的生成:mail查看郵件
(1)
交互式輸入;. 單獨成行可以表示正文結束;
(2)
通過輸入重定向;
~]# mail -s 'fstab file' root < /etc/fstab
(3) 通過管道;
~]# cat /etc/fstab | mail -s 'to you' jklte
at命令:
at是有atd服務提供的,在centos6
上可以使用service atd start來啟動服務:在centos7 上要使用sysemctl start
atd.service
at
[OPTION]... TIME
常用選項:
-l:查看作業隊列,相當于atq
-f /PATH/FROM/SOMEFILE:從指定文件中讀取作業任務,而不用再交互式輸入;
-d:刪除指定的作業,相當于atrm;
-c:查看指定作業的具體內容;
-q QUEUE:指明隊列;
注意:作業執行結果是以郵件發送給提交作業的用戶;
TIME:
HH:MM [YYYY-mm-dd] :如20:01
2016-11-9
noon,midnight, teatime
tomorrow
now+#
UNIT:minutes, hours, days, OR weeks
at的作業有隊列,用單個字母表示,默認都使用a隊列;
~]# at now
+3min
at> cat/issue
at> ls /var
at> echo "hello there"
Ctrl+d提交亦可;
問題:顯示Can't open /var/run/atd.pid
to signal atd. No atd running?
答:service atd
start(開啟atd)
例子:
實例1:三天后的下午 5 點鍾執行
/bin/ls
# at 5pm + 3 days
at> /bin/ls
at>
job 7 at 2016-01-08 17:00
實例2:明天17點鐘,輸出時間到指定文件內
# at 17:20 tomorrow
at> date > /root/doiido.log
at>
Job 8 at 2016-01-06 17:20
batch命令:
batch會讓系統自行選擇在系統資源較空閑的時間去執行指定的任務;
周期性任務計劃:cron,crontab
crontab是由crond服務提供的。
向crond提交作業的方式不同于at,它需要使用專用的配置文件,此文件有固定格式,不建議使用文本編輯器直接編輯此文件;要使用crontab命令;
服務程序:
cronie:主程序包,提供了crond守護進程及相關輔助工具;
確保crond守護進程(daemon)處于運行狀態:
CentOS
7:啟動服務
systemctl ?status
crond.service
Active: active (running) ... ...
CentOS
6:啟動服務
service ?crond
status
... is running.
1、cron任務分為兩類:
系統cron任務:主要用于實現系統自身的維護;
手動編輯:/etc/crontab文件
用戶cron任務:
命令:crontab命令
(1)系統cron的配置格式:/etc/crontab
注意:
(1)
每一行定義一個周期性任務,共7個字段;
*
* ?* ?*
* : 定義周期性時間
user-name :
運行任務的用戶身份
command to
be executed:任務
(2)
此處的環境變量不同于用戶登錄后獲得的環境,因此,建議命令使用絕對路徑,或者自定義PATH環境變量;
(3)
執行結果郵件發送給MAILTO指定的用戶
(2)用戶cron的配置格式:/var/spool/cron/USERNAME
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# 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
# | ?|
| ?|
|
# * ?*
* ?* ?*
command to be executed
注意:
(1)
每行定義一個cron任務,共6個字段;
(2)
此處的環境變量不同于用戶登錄后獲得的環境,因此,建議命令使用絕對路徑,或者自定義PATH環境變量;
(3)
郵件發送給當前用戶;
時間表示法:
(1) 特定值;
給定時間點有效取值范圍內的值;
注意:day of
week和day of month一般不同時使用;
(2) *
給定時間點上有效取值范圍內的所有值;表“每..”
(3) 離散取值:,
在時間點上使用逗號分隔的多個值;
#,#,#
(4) 連續取值:-
在時間點上使用-連接開頭和結束
#-#
(5)
在指定時間點上,定義步長:
/#:#即步長;
注意:
(1)
指定的時間點不能被整除時,其意義將不復存在;
(2)
最小時間單位為“分鐘”,想完成“秒”級任務,得需要額外借助于其它機制;
定義成每分鐘任務:而在利用腳本實現在每分鐘之內,循環執行多次;
示例:
(1) 3 * * *
*:每小時執行一次;每小時的第3分鐘;
(2) 3 4 * *
5:每周執行一次;每周5的4點3分;
(3) 5 6 7 *
*:每月執行一次;每月的7號的6點5分;
(4) 7 8 9 10
*:每年執行一次;每年的10月9號8點7分;
(5) 9 8 * *
3,7:每周三和周日;
(6) 0 8,20 * *
3,7:每周三和周日;8點整和20點整
(7) 0 9-18 * *
1-5:每周一到周五:9點正到18點正
(8) */5 * * *
*:每5分鐘執行一次某任務;
(9) */7
crontab命令:
crontab [-u user] [-l | -r | -e]
[-i]
-e:編輯任務;自動打開人物編輯器
* * * * * /bin/echo ?"hello world"
-l:列出所有任務;
-r:移除所有任務;即刪除/var/spool/cron/USERNAME文件;
-i:在使用-r選項移除所有任務時提示用戶確認;
-u
user:root用戶可為指定用戶管理cron任務;
注意:運行結果以郵件通知給當前用戶;如果拒絕接收郵件:
(1) COMMAND
> /dev/null
(2) COMMAND
&> /dev/null
注意:定義COMMAND時,如果命令需要用到%,需要對其轉義;但放置于單引號中的%不用轉義亦可;
touch
file-$(date +%f-%H-%M-%S)
思考:某任務在指定的時間因關機未能執行,下次開機會不會自動執行?
不會!.
如果期望某時間因故未能按時執行,下次開機后無論是否到了相應時間點都要執行一次,可使用anacron實現;
anacron:
生產環境中的linux主機,通常都是全天、全年無休止的工作,同樣在其之上指定的任務計劃也需要每天、每周、固定時間去執行,如果沒有什么意外情況(比如斷電),那么任務就會按照設定的時間去執行,但是如果在某一周內系統發生了斷電情況,在恢復供電期間恰好有一些任務計劃要執行,此時任務計劃就失效了,當恢復供電后,系統需要等到下一個周期才能繼續執行此任務,也就意味著斷電期間的任務將失效。
但恰恰在這期間要執行的任務也非常重要,該怎么辦?有沒有手動去執行的方法嗎? 有!那就是
anacron
那么anacron如何知道Linux
系統何時關機的呢?anacron會記錄上次anacron執行的時間,anacron會去分析現在的時間與記錄上次運行anacron的時間,兩者比較后若發現有差異,那就是在某些時刻沒有進行計劃任務了,此時anacron就會開始運行未進行的crontab任務,所以anacron其實是通過crontab來運行的
anacron是一個程序,而非一個服務,anacron也有自己的配置文件/etc/anacrontaba。
練習:
1、每12小時備份一次/etc目錄至/backups目錄中,保存文件名稱格式為“etc-yyyy-mm-dd-hh.tar.xz”
2、每周2、4、7備份/var/log/secure文件至/logs目錄中,文件名格式為“secure-yyyymmdd”;
~]# mkidr
logs
~]# crontab
-e
0 1 * *
2,4,7 /bin/cp /var/log/secure /logs/secure-$(date
+%Y-%m-%d-%H-%M)> /dev/null
3、每兩小時取出當前系統/proc/meminfo文件中以S或M開頭的行信息追加至/tmp/meminfo.txt文件中;
~]# crontab
-e
0 */2 * * *
/bin/ grep "^[S,M]" /proc/meminfo
>>/tmp/meminfo.txt
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态