計劃任務
工作當中有時候需要將某件事情在未來的某個特定的時間執行,而自己確不在機器旁,該如何是好?像這樣在每天特定的時間內去安排做一些事情這樣,一種事情我們就稱之為例行性的計劃任務,其實在我們的操作系統當中都有類似的例行性任務計劃功能,那如何去像設定鬧鐘一種在Linux上指定例行性計劃任務并實施,主要有兩種工具:at和crontab
計劃任務分類:
一次性的計劃任務:只執行一次就結束
周期性的計劃任務:每隔一定的周期去做相同的事情
一、 一次性計劃任務
at用來專門處理一次性計劃任務,crontab是根據用戶自定義的時間內,循環的去做某些事情
at
at是由atd服務提供的,在6版本的系統上使用service atd start啟動服務,7版本的系統上使用systemctl start atd啟動服務(atd服務不起來,at計劃是不工作的,at計劃任務是依靠atd服務來工作運行的)
1.at使用方法
at [-V] [-q queue] [-f file] [-mMlbv] -c job [job…]TIME
-V:顯示版本信息
-l:相當于atq,列出指定隊列中等待運行的作業
-d n:相當于atrm,刪除指定的作業
-c n:查看第n個具體作業任務
-f 把at要執行的所有任務放置于文件中,讓at讀取此文件作為要運行的任務,如at –f /root/a.txt
2.TIME的格式:定義什么時候進行at任務的時間
HH:MM 如12:00
在今天的HH:MM時刻進行,若該時間以過,則明天HH:MM進行此工作
HH:MM YYYY-MM-DD 如13:00 2016-09-01
強制規定在某年某月的某天的特殊時刻進行該工作
HH:MM[am|pm] [Mouth][Date]:如04pm March 10
強制在某年某月的某個時刻進行
HH:MM[am|pm] +number[minutes][hours][days][weeks]:如now+10minutes或04pm+3days,指在某個特定時間點再加某個時間點后才運行
3.模糊時間:
noon:正午
midnight:子夜
teatime:下午四點
4.執行方式
交互式(直接在命令執行at命令進入交互模式)
輸入重定向
at –f 文件
依賴于atd服務,需要啟動才能實現at任務
at隊列存放在/var/spool/at目錄中
通過/etc/at.allow /etc/at.deny控制用是否能執行at任務
首先尋找/etc/at.allow文件,文件中的使用才能使用at,沒有在allow文件中的用戶則不能使用at,如果某個用戶即不在allow和deny文件中,那么只有root才能使用at,同理,在deny文件中的用戶則不能使用at,不在deny 文件中的用戶則可以使用at,如果兩文件寫了同一個用戶,首先匹配allow即允許(默認at.allow文件不存在,需用戶自己創建)
二、周期性計劃任務
cron
相關程序包
cronie:主程序包,提供crond守護進程及相關輔助工具,自身是一個不間斷運行的服務
cronie-anacron:cronie的補充程序;用于監控cronie任務執行狀況,能夠實現cronie的任務因為各種原因在過的時間該執行而未執行的任務恢復正常
crontabs:包含CentOS提供系統維護任務
確保crond守護處于運行狀態
systemctl status crond 7版本的系統
service status crond 6及6以下版本的系統
計劃周期性執行的任務交給crond,到指定時間會自動運行
(一) 系統cron任務:系統維護作業
/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
五個字段字段的意思分別是分鐘 小時 日 月 周
例如:凌晨4點備份/etc/目錄下面的內容到/tmp下
0 4 * * * root tar zcf /tmp/etc.tar.gz /etc/
1.時間的有效取值
分鐘 0-59
小時 0-23
日 1-31
月 1-12
周 0-7 0.7表示周日
2. 時間通配
* * 1 * * * 每月的1號執行某任務
特定值:給定時間有點取值范圍內的值
離散取值
10,40 * * * * 每周每天每小時的第10分鐘和第40分鐘執行
連續取值:-
* * * * 1-5 周一到周五運行
3.在指定時間范圍上定義步長
/#:#即為步長
*/3 * * * * 每三分鐘執行
cron的環境變量,cron執行所有命令都去PATH環境變量指定的路徑下去找
PATH /bin:/sbin:/usr/bin:/usr/sbin
4.時間格式
@rebootRun once after reboot. 重啟后執行
@yearly0 0 1 1 *
@annually0 0 1 1 *
@monthly0 0 1 * *
@weekly0 0 * * 0
@daily0 0 * * *
@hourly0 * * * *
5.系統的計劃任務
/etc/crontab
/etc/cron.d 配置文件
/etc/cron.hourly 每小時任務
/etc/cron.daily 每日任務
/etc/cron.weekly 每周任務
/etc/cron.monthly 每周任務
(二) anacron系統
運行計算機關機時cron不運行的任務,CentOS6以后版本取消anacron服務,由crond服務管理
假設計算機沒有一直開機
對筆記本電腦、臺式機、工作及其他不一直開機的系統很重要
對偶爾要關機的服務器很有用
配置文件:/etc/anacrontab,負責執行/etc/cron.daily /etc/cron.weekly /etc/cron.monthly中系統任務。/etc/cron.hourly由/etc/cron.d/0hourly執行
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
字段1:如果在這些日子里沒有運行這些任務
字段2:在重新引導后等待這么多分鐘后運行它
字段3:任務識別器,在日志文件中識別
字段1:要執行的任務
linux系統中管理臨時文件
rhel6使用/etc/cron.daily/tmpwatch定時清除臨時文件
rhel7使用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
命令
system-tmpfiles –clean|remove|create configfile
(三) 用戶計劃任務管理
用戶級別的周期性計劃是通過crontab命令實現的,其也有對應的配置文件/var/spool/cron、目錄中與用戶名同名的文件中,可以通過crontab命令來指定任務計劃
crontab命令(實則打開的是一個vim編輯器編輯里面的內容)
crontab [-u user] [-l | -r | -e] [-i] [-s]
-l:列出所有 任務
-e:編輯任務
-r:移除所有任務
-i:通-r一同使用,以交互式模式移除指定任務
-u user:僅root可運行,指定用戶管理cron任務
控制用戶執行計劃任務
/etc/cron.allow(文件默認不存在) /etc/cron.deny
管理機制跟at相同
普通用戶執行crontab具有suid權限,當root用戶更改了普通用戶的計劃任務的屬主為root,普通用戶修改,文件被覆蓋了,文件的屬主又變成普通用戶了
注意:運行結果的標準輸出和錯誤以郵件通知給相關用戶
command > /dev/null
command &> /dev/null
對于cron任務來講,%有特殊用途,如果在命令中要使用%,則需要轉義;不過,如果把%防止于單引號中,也可以不用轉義
我們知道在計劃當中最小單位是分鐘,那我們實際工作中有時需要更精確的執行某項任務,需要達到秒級別的任務,那該如何實現呢,實則可以用循環的方式來執行如下:
* * * * * for min in 0 1 2 ;do echo “hi”;sleep 3;done
如何實現每7分鐘運行一次任務
sleep命令
sleep number [SUFFIX]
SUFFIX:
s:秒,默認
m:fen
h:小時
d:天
1、 每周2, 4, 7備份/var/log/messages文件至/logs目錄中,文件名形如“messages-yyyymmdd”
crontab -e
* * * * 2,4,7 tar -zcf /logs/messages-`date ‘+%F’` /var/log/messages
2、 每兩小時取出當前系統/proc/meminfo文件中以S或M開頭的信息追加至/tmp/meminfo.txt文件中
* */2 * * * grep –Eo “^[sM].*” /proc/meminof >> /tmpmeminfo.txt
原創文章,作者:fszxxxks,如若轉載,請注明出處:http://www.www58058.com/45121