一、任務計劃
Linux任務計劃是週期性任務執行,在特定的時間內去安排做一些事情,這樣一種事件我們就稱之爲任務計劃,就像人設置的鬧鐘一樣,每天定時定點的會響叫醒人,
Linux任務計劃的分類:
一次性的任務計劃:只執行一次就結束
at命令就是傳夢用來處理一次性的計劃任務,
batch:系統自行選擇空閒時間去執行此處指定的任務
週期性的任務計劃:每隔一定的週期去做相同的事情
二、AT命令
at 命令可用於創建任務計劃,或查看任務計劃。at是有atd服務提供的,需要啓動才能實現at 任務,在centos6上可以使用service atd start 來啓動服務,centos7上要使用systemctl start atd.service來啓動服務。
1、at命令的使用方法:
at [選項] TIME
選項:
-V :顯示所安裝的at包的版本信息
-v:可以使用較明顯的時間格式列出at中的工作列表
-l: 列出指定隊列中等待運行的作業;相當於atq
-d: 刪除指定的作業;相當於atrm
-c: 查看具體作業任務
-f /path/from/somefile:從指定的文件中讀取任務,一般爲已編寫好的腳本,在某一刻運行該腳本,把任務機會的內容編寫在腳本中
-m:當任務被完成之後,將給用戶發送郵件,即使沒有標準輸出
TIME:
TIME指任務執行的時間,什麼時候執行這個任務,TIME有一下幾種格式:
HH:MM 如:20:20 下午8點20分
在今天的HH:MM時刻進行,若該時刻已超過當時時間,則會在明天的HH:MM進行此工作。(24小時制)
HH:MM YYYY-MM-DD 如:20:20 2019-01-01 2019年1月1日下午8點20分
強制規定在某年某月的某一天的特殊時刻進行該工作(24小時制)
HH:MM[am|pm] [Month] [DATE]\ 如:04pm March 17 3月17日下午4點
強制某年某月某日的某時刻執行(12小時制)
HH:MM[am|pm]+number[minutes|hours|days|weeks] 如:now +5minutes或者04pm + 3 days
指某個時間點再加幾個時間後才進行。
注意:作業執行命令的結果中的標準輸出和錯誤以郵件通知給相關用戶
例:
1.創建一個at任務計劃
方法一:
方法二:
2.查看所有的at計劃任務
3.刪除一個任務計劃
2、查看at隊列中有哪些at任務計劃
atq :查看當前所有還未執行的任務計劃
at -c # :查看at隊列中指定序號#的任務計劃的內容,
3、at的執行方式:
1)交互式,2)輸入重定向,3)at -f 文件
at隊列存放在/var/at.{deny,allow}
allow 白名單:/etc/at.allow 默認存在,拒絕該文件中用戶執行at命令
deny黑名單:/etc/at.deny默認存在,拒絕該文件用戶執行at命令,而沒有在at.deny文件中的使用者則可執行
如果兩個文件都不存在,只有root可以執行at命令
編輯白名單和黑明這兩個文件的方法是直接在文件中寫入用戶名即可
4、移除at任務
如果發現一個at任務計劃有問題,需要更改,怎麼處理呢?可以使用atrm命令刪除
atrm # :刪除一個at任務
三、週期性任務計劃cron
相關的程序包:
cronie: 主程序包,提供crond守護進程及相關輔助工具cronie-anacron: cronie的補充程序,用於監控cronie任 務執行狀況,如cronie中的任務在過去該運行的時間點未能正常 運行,則anacron會隨後啓動一次此任務
crontabs:包含CentOS提供系統維護任務
1、crontab是由crond服務提供的,centos6中可以使用service crond start來啓動crond服務,在centos7中要使用systemctl restart crond.crond來啓動服務
2、計劃週期性執行的任務提交給crond,到指定的時間會自動運行
3、cron任務有兩類:系統cron和用戶cron。系統任務是指系統級別的例行性任務計劃,系統級別的cron制定通過編輯其配置文件/etc/crontab來實現
其中:
五個*表示對應的時間點
user-name:用戶身份;執行任務的用戶的用戶名
command to be executd:要運行的任務;可以是命令,可以是腳本文件
注意:建議在定義cron任務是,所用到的命令使用絕對路徑;如果是腳本,腳本中的命令使用絕對路徑,或自定義一個擁有完整路徑的環境變量,因爲如上圖所示第二行:PATH=/sbin:/bin:/usr/sbin:/usr/bin 。該腳本中的PATH僅有這幾個路徑。而在終端上的環境變量PATH確實有更多路徑例圖:
所以,如果不輸入命令的全部絕對路徑,那就很可能有些命令會超出本文件中的路徑範圍,是的命令不能正常執行從而導致出錯,腳本中的命令也是要絕對路徑
4、時間表示
五個*時間點分別是
分鐘 小時 天 月 周幾
相關時間的表示方法,如:
0 0 1 1 * :每年一月一日0點0分執行一次
20 20 20 * * :每月20號20點20分執行一次
20 20 * * *:每天的20點20 分執行一次
3 * * * *:每小時3分的時候執行一次
* * * * * :每分鐘執行一次
20 20 * * 3:每週3的20點20分執行一次
時間表示法:
1)特定值
給出時間點有效取值範圍內的值(秒不能超過60,小時不能超過24小時)
2)*
每...
3)離散取值(同一個時間點給出多個值,可以是不連續的)
#,#,#
4)連續取值(連續的時間值內)
#-#
5)在指定時間範圍上定義步長(每隔多長時間執行一次)
*/#
例: */10 * * * * 每隔十分鐘執行一次
6)特殊的時間表示格式
@reboot Ronce 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 * * * *
5、示例
每分鐘以root的身份執行一次/app/sh/qipan.sh這個腳本
每小時的10分20分30分時,以root的身份執行ls /app 這個命令
每天隔10隔小時10分的時候執行wall a
6、對於命令的執行結果
對於人物運行的後果,默認郵件發送給任務相關的用戶,當然也可以丟棄郵件,輸出重定向:
cmd >/dev/null
cmd \>& /dev/null
cmd \> /dev/null 2\>&1
7、用戶級的計劃任務
用戶級別的計劃任務通過crontab命令來實現的,其也有對應的配置文件在/var/spool/cron/目錄中,
8、命令創建用戶級別的計劃任務命令crontab
crontab 命令:
-l:累出已定義好的的所有任務
-e:打開編輯界面定義任務(會直接進入文件/tmp下以crontab.開頭的隨機文件中中,一行編輯一個任務計劃,然後保存退出,就會自動將計劃任務添加至/var/spool/cron/USERNAME中去,每個用戶都有專用cron任務文件以自己的用戶名爲名保存在/var/spool/cron目錄中)
-r:remove,移除所有任務
-i:同-r 一同使用,以交互式模式移除指定任務
注意:刪除一個任務應該通過-e選項進入編輯界面刪除行實現,
使用crontab命令設置用戶級別計劃任務的格式跟系統級計劃任務的任務格式差不多,格式爲: * cmd 。只是少了執行者的用戶名
以上針對的是當前用戶的任務計劃信息,當然我們還可以針對其他指定用戶的任務計劃操作,使用-u username ,所支持的選項如上。(僅root可以運行,指定用戶管理cron任務)
crontab 也可以不加任何選項,在這種情況下不會進入編輯界面但是會進入一個臨時編輯任務的界面,可以輸入一行任務計劃然後按Ctrl+d保存退出,這個計劃任務就會自動寫入編輯界面的文件中去,但是有一個缺點,就是會覆蓋文件使其之前編輯的任務全部消失,只剩下這一條,而且在這種情況下一次只能編寫一條計劃任務,如多編輯多條則只有最後一條會生效。但是使用-e選項就不同了,可以一次性編輯多條計劃任務,且每一條都會生效。
例:使用crontab命令在臨時界面創建一個任務,然後在使用-l選項查詢一下
如果crontab中的命令中需要使用%時,需要對其進行轉義,轉義符號是“\”,或將%放置於單引號中則可不用轉義如上圖中所示。
控制用戶執行計劃任務的文件
/etc/cron.{allow|deny}
9、練習:
1.沒4個小時執行一次對/etc目錄的備份,備份至/backkup中,保存的目錄名爲etc-後面跟當時的時間;如:etc-201804050202
然後保存退出就可以了
2.編寫兩個腳本/app/sh/naozhong.sh和/app/sh/xingle.sh,使其每天早上8點自動執行腳本/app/sh/naozhong.sh叫我起牀,然後在8點05分時在執行/app/sh/xingle腳本把/app/sh/naozhong 給自動停了。
先變寫/app/sh/naozhong.sh腳本
再編寫/app/sh/xingle.sh腳本
最後創建這兩個計劃任務
10、如何在秒級別運行任務
* * * * * for min in 0 1 2; do echo "hi"; sleep 20; done
11、如何實現每隔多長時間運行一次任務
sleep 命令:
sleep #[時間單位]
時間單位:
s:秒,(默認)
m:分
h:小時
d:天
四、anacron系統
生產環境中的Linux主機,通常都是全天、全年無休止的工作,同樣在其之上制定的任務計劃也是需要每天、每週、固定時間去執行,如果沒有什麼意外情況(譬如:斷電),那任務就會按照設定的時間去執行,但是如果在某一週期內系統發生的斷電情況,在恢復供電期間正好有一些計劃任務去執行,此時任務計劃就失效了,當恢復供電之後,系統需要等到下一週期才能繼續執行此任務,也就意味着斷電期間的任務將失效。但恰恰在這期間要執行的任務也非常重要,該怎麼辦呢?只能手動去執行了,這...沒有自動去執行的方法嗎?有!那就是anacron
anacron並不是用來取代crontab的,anacron存在的目的就在於我們上面提到的,解決一些非24小時在線的Linux系統上的crontab無法正常運行的問題。Anacron並不能指定何時運行某項任務,而是以天爲單位或者在啓動後立即進行anacron動作,他會去檢測停機期間應該進行但是並沒有進行的crontab任務,並將該任務運行一遍後,anacron就會自動停止了
由於anacron會以一天、一週、一個月爲週期去檢測系統未進行的crontab任務,因此對於某些特殊的使用環境非常有幫助,因此當你的Linux主機斷電時,可能存在許多crontab的任務無法進行,anacron剛好可以解決這個問題。如:筆記本電腦、臺式機、工作站、偶爾要關機的服務器及其它不一直開機的系統很重要很有用
那麼anacron如何知道Linux系統是何時關機的呢?Anacron會記錄上一次anacron執行的時間,anacron會去分析現在的時間與記錄上次運行的時間,兩者比較後若發現有差異,那就是某些時刻沒有進行計劃任務了,此時anacron就會開始運行未進行的crontab任務,所以其實anacron也是通過crontab來運行的
anacron是一個程序,而不是一個服務,anacron也有自己的配置文件,語氣相關的配置文件有:
配置文件:/etc/anacrontab
負責執行以下幾個文件中的系統任務:/etc/cron.daily
/etc/cron.weekly
/etc/cron.monthly
由/ec/cron.hourly/Oanncron執行
當執行任務時,更新/var/spool/anacron/cron.daily文件的時間戳
1、配置文件
先來看一下配置文件中的內容
這個文件中設置了要監管哪些文件中的系統任務,使在那些文件中系統任務即使關機沒有正常執行的系統任務在開機後也會依舊執行,
配置文件的編寫格式
Period in days:這是任務的頻率,以天來指定,或者是@daily、@weekly、@monthly代表每天、每週、每月一次,你也可以使用數字:1代表每天;7代表每週;30代表每月
Delay in mminutes:這是在執行一個任務前等待的時間,單位是分鐘。
Job-identifier:這是卸載日誌文件中任務的獨特名字
Command:這是執行任務的命令或shell腳本,或者是文件,文件裏面包含一些系統任務
2、anacron的執行流程
Anacron會檢查任務是否已經在period字段指定的時間被執行了。如果沒有,則在等待delay字段中指定的分鐘數後,執行cmmand字段中指定的命令,一旦任務唄執行了,它會使用job-identifier(時間戳文件名)字段中指定的名稱將日期記錄在/var/spool/anacron目錄中的時間戳文件中。
3、管理臨時文件
1.Centos6使用/etc/cron.daily/tmpwatch定時清除臨時文件
tmpwatch工具從指定的目錄中遞歸地搜索,並刪除在指定時間段內沒有被訪問的文件。tmpwatch一般被用來清掃那些用來臨時駐留文件的目錄,(譬如:/tmp)tmpwatch忽略符號鏈接,它不會切換文件系統,而且只刪除空目錄和常規文件
1)語法:
tmpwatch [短選項] [長選項] [超期時間] [目錄...]
選項:
-a或- -all :刪除任何類型的文件
-f或- -force :強制刪除文件或目錄,其效果類似rm指令的“-f”參數
-q或- -quite :不顯示執行執行過程
-v或- -verbose :詳細的顯示指令執行過程
-test :僅測試,並不是真的刪除文件或目錄
2.Centos7使用systemd-tmpfiles-setup服務實現
配置文件: /etc/tmpfiles.d/*.conf
/run/tmpfiles.d/*.conf
/usr/lib/tmpfiles/*.conf
查看一下系統臨時文件的配置文件/usr/lib/tmpfiles.d/tmp.conf
1)臨時文件的配置文件格式
文件類型 文件名 權限 所屬人 所屬組 文件的存在時間
v /tmp 1777 root root 10d
文件名就是保存臨時文件的目錄
關於文件存在時間的設定就是在該時間內文件不能被刪除,超過那個時間纔可以被刪除,單位s/秒;h/小時;d/天
2)命令systemd-tmpfiles
systemd-tmpfiles --create /usr/lib/tmpfiles.d/*.conf :執行臨時文件的配置
systemd-tmpfiles --clean /usr/lib/tmpfiles.d/*conf :清理該配置文件中超過文&件存在時間的臨時文件
systemd-tmpfiles --remove /usr/lib/tmpfiles.d/*conf:刪除配置文件中所有的臨時文件
五、計劃任務Reboot的解決方法
還有一種情況就是在編輯計劃任務的時候,設置了一條在重啓之後重啓的計劃任務怎麼辦解決,因爲如果這樣,重啓之後就會執行計劃任務重新啓動,啓動成功後又執行計劃任務重新啓動,將會進入無窮無盡的重啓使其開不開機,在這種情況下,我們將怎麼辦呢?
如:@reboot root /bin/reboot
別急還有有辦法的,如下:
Centos 7:
1.重啓之後,進入grub,在Linux16這一行的行未加上空格rd.break;按Ctrl+x
2.mount -o remount,rw/sysroot
3.vi /sysroot/etc/crontab刪除文件中那一行計劃任務重啓即可
Centos 6: