Linux 任務計劃、周期性任務執行
概述:
什么是任務計劃呢?就像我們每個人日常生活中都會使用到的鬧鐘一樣,按時的去提醒該去做什么事情,以免忘記。同樣,我們在工作當中也要在每天在特定的時間內安排做一些事情,這就是任務計劃,本章將學習如何制定Linux系統的任務計劃,這里主要包括兩種工具:at和crontab。
一、定義
1.任務計劃的分類:
一次性的任務計劃:只執行一次就結束;
周期性的任務計劃:每隔一定的時期去做相同的事情;
2.使用的命令
未來時間點執行一次某任務:at, batch;
周期性運行某任務: crontab
3.執行結果會通過郵件發送給用戶
確定郵件服務是否開啟執行如下命令,能看到25號端口即開啟
~]# netstat -tnlp ~]# ss -tnl
[root@CentOS6 ~]# netstat -tnlp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:53634 0.0.0.0:* LISTEN 1690/rpc.statd tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1648/rpcbind tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1904/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1725/cupsd tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1983/master tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 2167/sshd tcp 0 0 :::111 :::* LISTEN 1648/rpcbind tcp 0 0 :::57264 :::* LISTEN 1690/rpc.statd tcp 0 0 :::22 :::* LISTEN 1904/sshd tcp 0 0 ::1:631 :::* LISTEN 1725/cupsd tcp 0 0 ::1:25 :::* LISTEN 1983/master tcp 0 0 ::1:6010 :::* LISTEN 2167/sshd
4.本地電子郵件服務:
smtp協議:simple mail transmission protocol 簡單郵件傳輸協議;
pop3:Post Office Procotol 郵局協議
imap4:Internet Mail Access Procotol 互聯網郵件訪問協議;
5.本地主機收發郵件:
MUA:Mail User Agent,用戶收發郵件的工具程序;
mail 命令
語法:mailx [-s 'SUBJECT'] username[@hostname]
郵件正文的生成:
1)交互式輸入:. 號單獨成行可以表示正文結束;Ctrl+d提交亦可;
mail -s 'Hello root' root
2)通過輸入重定向;
mail -s 'fstab file' root < /etc/fstab
3)通過管道;
cat /etc/issue |mail -s 'issue file' root
at命令
1.at是由atd提供服務的,在使用之前要確認是否開啟;
CentOS 6:service atd {status|start}
CentOS 7: systemctl {status|start} atd
2.語法:at [option] TIME
TIME:定義出什么時候執行這項任務
-
HH:MM [YYYY-mm-dd];
-
HH:MM[am|pm] [Month] [Date];
-
noon, midnight, teatime(下午4點),tomorrow
-
now+#{minutes,hours,days, OR weeks}
示例:
1)HH:MM 如:02:00
在今日的HH:MM 進行,若該時刻已過,則明天此時執行任務
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 + 5 minutes
04pm + 3 days
示例:
[root@CentOS6 ~]# at now+1min at> ls at> echo "hello taotao"<EOT> job 11 at 2016-09-11 05:02 [root@CentOS6 ~]# at -l 13 2016-09-11 05:12 a root [root@CentOS6 ~]# at 20:00 at> echo "hello tao" |mail -s 'TAO test' tao at> <EOT> job 14 at 2016-09-11 20:00
3.at 的作業有隊列,存放在/var/spool/at 中,用單個字母來表示,默認搜使用a隊列;
4.常用選項:
-q QUEUE:指明隊列;
-l: 列出指定隊列中等待運行的作業;相當于atq
-d #: 刪除指定作業號的作業;相當于atrm
-c: 查看具體作業任務
-v:可以使用較明顯的時間格式列出at中的工作列表;
-f /path/from/somefile:從指定的文件中讀取任務,不再交互式輸入
# at -f /testdir/at.txt
-m:強制at發送郵件,表示執行完畢
-
注意:作業執行命令的結果中的標準輸出和錯誤以郵件通知給相關用戶
5./etc/at.{allow,deny}控制用戶是否能執行at任務
白名單:
/etc/at.allow 默認不存在,只有該文件中的用戶才能執行at命令
黑名單:
/etc/at.deny 拒絕該文件中用戶執行at命令,而沒有在at.deny 文件中的使用者則可執行。
注意:
1)白名單的優先級是大于黑名單的,如果一旦創建,則只有白名單中的用戶,才可以執行at命令,其他用戶即使不白名單中的用戶統統沒有權限執行at命令;如果沒有白名單,則只有黑名單起作用,此時,在黑名單中的用戶是不能執行at命令的,不在黑名單中的用戶統統默認是允許執行at命令的;
2)如果兩個文件都不存在,只有root 可以執行at 命令
2.batch命令:
讓系統自行選擇空閑時間去執行此處指定的任務;
周期性任務計劃:cron;
1.服務程序相關的程序包:
-
cronie: 主程序包,提供crond守護進程及相關輔助工具
-
cronie-anacron:cronie的補充程序;用于監控cronie任務執行狀況;如cronie中的任務在過去該運行的時間點未能正常運行,則anacron會隨后啟動一次此任務
-
crontabs:包含CentOS提供系統維護任務
2.確保crond守護進程(daemon)處于運行狀態:
-
CentOS 7: systemctl status crond
[root@centos7 ~]# systemctl status crond ● crond.service - Command Scheduler Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2016-09-11 10:33:25 CST; 2h 26min ago
-
CentOS 6 :service crond status
[root@CentOS6 ~]# service crond status crond (pid 2024) is running...
3.向crond提交作業的方式不同于at,他需要使用專用的配置文件,此文件有固定格式,不建議使用文本編輯器直接編輯此文件,要使用crontab命令,可以檢查語法是否有錯誤。
4.cron任務分為兩類:
-
系統cron任務:主要用于實現系統自身的維護;
手動編輯:/etc/crontab文件
-
用戶cron任務:命令 crontab
5.用cron執行的計劃任務默認存放在:
日志:/var/log/cron
cron 配置格式
1.系統cron的配置格式:/etc/crontab
如下:
[root@CentOS6 ~]# 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
2.注意:
-
每一行定義一個周期性任務;共7個字段
* * * * *:定義周期性時間;
user-name:運行任務的用戶身份;
command to be executed:要執性的任務 -
此處的環境變量不同股用戶登錄后獲得的環境變量,因此,建議命令使用絕對路徑,或者自定義的PATH環境變量
-
執性結果郵件發送給MAILTO指定的用戶
3.系統的計劃任務:
-
/etc/crontab
-
/etc/cron.d/ 配置文件
[root@CentOS6 ~]# cd /etc/cron.d [root@CentOS6 cron.d]# cat 0hourly SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ 01 * * * * root run-parts /etc/cron.hourly # run-parts 為一個程序,可以把腳本放在一個文件中一起執行,不用單個執行
-
/etc/cron.hourly/ 腳本
-
/etc/cron.daily/腳本
-
/etc/cron.weekly/腳本
-
/etc/cron.monthly/腳本
2.用戶cron配置格式:/var/spool/cron/USERNAME
使用命令:crontab -e
如下:
[root@CentOS6 ~]# 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 # | | | | | # * * * * * command to be executed
注意:
-
每行定義一個cron任務,共6個字段
-
此處的環境變量不同股用戶登錄后獲得的環境變量,因此,建議命令使用絕對路徑,或者自定義的PATH環境變量
-
郵件發送給當前用戶
時間表示法:
五個時間點分別是:分鐘 小時 天 月 周幾
1.特定值:
給定時間點有效取值范圍內的值;
注意:day of week和day of month一般不同時使用;
2.*:
給定時間點上有效取值范圍內的所有值;表示“每..”
示例:
(1)3 * * * *:每小時執行一次,每小時第三分鐘;
(2)3 4 * * 5:每周執行一次,每周五的4點3分;
(3)5 6 7 * *:每月執性一次,每月的7號6點5分;
(4)7 8 9 10 *:每年執行一次,每年的10月9號8點7分;
3.離散取值:,
在時間點上使用逗號分割的多個值:#,#,#
示例:
(1)9 8 * * 3,7:每周三和周日的8點9分;
(2)0 8,20 * * 3,7:每周三和周日的8點和20點
4.連續取值:-
在時間點導航使用-連接開頭和結束:#-#
示例:
(1)0 9-18 * * 1-5:周一到周五(工作時間)內的每小時執行;
5.在指定時間點上,定義步長:
*/#:#即步長
注意:
1)指定的時間點不能被步長整除時,其意義將不復存在;
2)最小時間單位為“分鐘”,想完成“秒”級任務,的需要額外借助其它機制;
即:定義成每分鐘任務,而再利用腳本實現每分鐘之內,循環執行多次;
示例:
(1)*/5 * * * *:每5分鐘執行一次任務;
(2)*/7:不能被整除,沒有意義
6.預定義的時間格式:
@reboot Run once after reboot.
@yearly —-> 0 0 1 1 * 每年;
@annually —-> 0 0 1 1 * 每年;
@monthly —-> 0 0 1 * * 每月;
@weekly —-> 0 0 * * 0 每周;
@daily —-> 0 0 * * * 每天;
@hourly —-> 0 * * * * 每小時
crontab命令
1.語法:crontab [-u user] [-l | -r | -e] [-i]
-e:打開編輯界面定義任務;
-l:列出所有任務;
-r:移除所有任務,即刪除/var/spool/cron/USERNAME文件
(刪除一個任務應該通過編輯界面刪除行實現)
-i:在使用-r選項移除所有任務時提示用戶確認;
-u user:root用戶可為指定用戶管理cron任務;
[root@CentOS6 ~]# crontab -u tao -e */2 * * * * /bin/echo "加油!??!" [root@CentOS6 ~]# crontab -u tao -l */2 * * * * /bin/echo "加油?。?!" You have new mail in /var/spool/mail/root
2.注意:
-
運行結果以郵件通知給當前用戶;如果拒接接收郵件:
(1)COMMAND > /dev/null
(2)COMMAND &> /dev/null
-
定義COMMAND時,如果命令需要用到%,需要對其轉義,但放置于單引號中的%不用轉義亦可;
如:touch $(date +%Y-%m-%d-%H-%M-%S)
3.思考:某任務在指定的時間因關機未能執行,下次開機會不會自動執行?
不會執行!
如果期望某時間因故未能按時執行,下次開機后無論是否到了相應時間點都要執行一次,可使用ancorn命令;
4.思考:
(1) 如何在秒級別運行任務?
* * * * * for min in 0 1 2; do echo "hi"; sleep 20; done
(2)sleep命令:
sleep NUMBER[SUFFIX]…
SUFFIX:
s: 秒, 默認
m: 分
h: 小時
d: 天
ancorn 命令:
運行計算機關機時cron不運行的任務,CentOS6以后版本取消anacron服務,由crond服務管理。
假設計算機沒有一直開機
對筆記本電腦、臺式機、工作站及其它不一直開機的系統很重要
對偶爾要關機的服務器很有用
配置文件:/etc/anacrontab,負責執行/etc/cron.daily ,/etc/cron.weekly /etc/cron.monthly中系統任務。/etc/cron.hourly/由/cron.d/0hourly執行
字段1:如果在這些日子里沒有運行這些任務……
字段2:在重新引導后等待這么多分鐘后運行它
字段3:任務識別器,在日志文件中標識
字段4:要執行的任務
當執行任務時,更新/var/spool/anacron/中文件的時間戳
管理臨時文件:系統自定義的文件
CentOS6使用/etc/cron.daily/tmpwatch定時清除臨時文件
CentOS7使用systemd-tmpfiles-setup服務實現
配置文件:
/etc/tmpfiles.d/*.conf
/run/tmpfiles.d/*.conf
/usr/lib/tmpfiles/*.conf
/usr/lib/tmpfiles.d/tmp.conf
d /tmp 1777 root root 10d
d /var/tmp 1777 root root 30d
命令:
systemd-tmpfiles –clean|remove|create configfile
案例:
1、每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、每周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
3、每兩小時取出當前系統/proc/meminfo文件中以S或M開頭的信息追加至/tmp/meminfo.txt文件中
# crontab -e # 20 */2 * * * /bin/grep -e '^S' -e '^M' /proc/meminfo >> /tmp/meminfo.txt
4、工作日時間內,每兩小時執行一次“ip addr show”命令
# crontab -e # 0 9-17/2 * * 1-5 /bin/`ip addr show`
原創文章,作者:zhumengxiaotao,如若轉載,請注明出處:http://www.www58058.com/45443