Linux計劃任務at&batch&crontab
計劃任務
執行一次某任務:at,batch
周期性運行某任務:crontab
1.at命令,只執行一次 at/atq/atrm/batch
at [option]... time
HH:MM[YYYY-mm-dd] //
noon,midnight,teatime //12:00,24:00,16:00
tomorrow HH:MM
now+#
UNIT:minutest,hours,days,weeks
-l 列出任務 //相當於atq
-f 從指定文件中讀取任務,而非交互式輸入
-c //查看工作內容
at -c 8 //查看作業內容,當前用戶註銷後,當然也會執行,at -c 會顯示所有的環境
-q 指明隊列
錯誤:Can‘t open /var/run/atd.pid to signal atd. No atd running?
service atd on
chkconfig atd on //開機啟動即可
at 1+min // ctrl +d提交
at的作業有隊列,用單個字母表示,默認都是用a隊列
註釋:作業執行結果是以郵件發給提交作業的用戶
註意:at的環境可能和登錄終端的環境不同,可能需要指定命令的全路徑
註意:先at.allow,後at.deny,一個用戶占用一行,不允許有空格
/etc/at.allow
/etc/at.deny
2.batch //讓系統自行選擇在空閑時間去執行指定任務,不需要再指定時間
3.crontab
/etc/cron.allow
/etc/cron.deny
服務程序:
cronle:主程序包
service crond [start|reload|stop|restart]
確保crond守護進程(daemon)處於運行狀態
systemctl status crond.service
service crond status
crontab 任務分為兩類:
系統級別任務:主要用於系統自身的維護 //例如自動清除臨時文件
手動編輯:/etc/crontab 文件
用戶cron任務:
/var/spool/cron/USERNAME 同名文件
命令:crontab 命令
分 時 天 月 周 command
周:sun,mon,tue,wed,thu,fri,sat /或者0-6
系統級別:[[email protected] test]# cat /etc/crontab
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# | | | | |
# * * * * * user-name command to be execute
1.每一行定義一個周期性任務,共7個字段
2.user-name 運行任務的用戶身份,用戶級別不需要
3.執行結果郵件發送給指定用戶
系統級別:[[email protected] test]# cat /etc/crontab
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 execute
1.每一行定義一個周期性任務,共6個字段
2.此處的環境變量不同於登陸後獲得的環境,因此,建議使用命令絕對路徑,或者自定義path變量
3.執行結果郵件發送給當前用戶
4.時間表示法
1)周 和 日 建議和日只使用一個,不同時使用
2)* 給定時間點上,有效取值範圍內的所有值
3)離散取值
逗號分開的多個值:#,#,#
9 8 * 3,7 //每周三,周日的8:09
* 8,20 * 3,7 //每周三,周日的8:00和20:00 每分鐘執行一次
4)連續取值
#-#
5)在指定時間上,定義步長
/#
*/7 * * * * //每5min執行一次
//前幾個為每7min,第8個7 56min的時候,最後一個不執行
//下一個小時,從0 從新開始沒7min
註意:
(1)指定的時間點不能被步長整除時,其意義將不復村子
(2)最小時間為min,想完成second任務,需要借助於其他機制
定義每分鐘任務,而在腳本中實現每分鐘之內,循環執行多次
5.crontabs
crontab [-u user] file
crontab [-u user] [-l | -r | -e] [-i] [-s]
crontab -n [ hostname ]
crontab -c
-i 在remove之前詢問y/Y
-e 編輯
-r 將刪除/var/spool/cron/USERNAME 的文件
刪除單個:crontab -e 行首加#,或者刪除該行
註意:運行結果以郵件方式通知給當前用戶;如果拒絕接受郵件
(1) COMMAND > /dev/null //只接受錯誤的郵件
(2) COMMAND &> /dev/null //都不接受郵件
定義COMMAND的時候,如果命令中有%,需要轉義 \%
或者 ‘ ‘ 單引號
6.anacron 用於恢復執行未執行的任務
以天為單位或者是在啟動後立刻進行anacron的動作,
它會去偵測停機期間應該進行但是並沒有進行的crontab任務,
並將該任務運行一遍後,anacron就會自動停止了
ll /etc/cron*/*ana* //來查看anacron的偵測時間
anacron命令的語法如下
-s開始連續的運行各項工作,會根據時間記錄來判斷是否進行
-f 強制執行,而不判斷時間登陸等時間戳
-n 立即進行未進行的任務,而不延遲等待時間
-u 僅僅升級記錄等的時間戳,不進行任何工作
而anacron的配置文件是/etc/anacrontab,而它的很多內容則是在/var/spool/anacron裏面保存。
當anacron下達anacron -s cron.daily時,它會有如下的步驟:
(1)由/etc/anacrontab分析到cron.daily這項工作名稱的天數為一天。
(2)由/var/spool/anacron/cron.daily取出最近一次運行anacron的時間戳。
(3)把取出的時間戳與當前的時間戳相比較,如果差異超過了一天,那麽就準備進行命令。
(4)若準備進行命令,根據/etc/anacrontab的配置,將延遲65分鐘。
(5)延遲時間後,開始運行後續命令,也就是run-parts /etc/cron.daily這串命令。
(6)運行完畢後,anacron程序結束。
思考:某任務在指定的時間因關機未能執行,下次開機不會自動執行?
不會!
如果期望某事件因故障未能按時執行,下次開機後無論是否到了相應時間點都要執行一次,可使用anacron
註意:at和crontab都有守護進程
註意:/etc/cron.day
小結:at,batch crontab,anacron
練習
1.每12小時備份一次/etc目錄至/backups目錄中,保存文件名稱格式為"etc-yyyy-mm-dd-hh.tar.xz"
0 */12 * * * l tar Jcf /tmp/test/etc-$(date +%F-%H-%S).tar.xz /etc
2.每周2,4,7備份/var/log/secure 文件到/logs目錄中,文件名格式為“secure-yyyymmdd""
0 0 * * 2,4,7
3.每兩小時取出當前系統/proc/meminfo文件中以S或M開頭的行信息追加至/tmp/meminfo.txt
* */2 * * * grep "^[S|M]" /proc/meminfo >> /tmp/meminfo.txt //註意:當前用戶要對meminfo.txt具有寫的權限,否則permission denied
問題:
/etc/crontab 中沒有run-parts
如何運行/etc/cron.daily 等文件
文件中run-parts部分所示,它使用 run-parts 腳本來執行存在於 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 和 /etc/cron.monthly
cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
run-parts是一個腳本文件, 內容是很簡單的一個shell腳本,就是遍歷目標文件夾,執行第一層目錄下的可執行權限的文件。
本文出自 “黑馬騰空” 博客,請務必保留此出處http://hmtk520.blog.51cto.com/12595610/1950157
Linux計劃任務at&batch&crontab