一,什麼是例行性工作排程?
計劃任務:比如每天,每週,每月,每年或者指定時間需要執行的工作任務
1,Linux工作排程的種類:at,cron
a)at :at 處理僅執行一次任務,依賴於atd服務
b)crontab :crontab處理循環的任務, 可循環的時間爲分鐘、小時、每週、每月或每年等。 crontab 除了可以使用指令執行外,也可以編輯 /etc/crontab 來支持。 依賴於crond服務
2,Linux上常見的例行性工作
(1)進行 登錄記錄的輪詢(log rotate)
(2)登錄文件分析logwatch的任務
(3)建立locate數據庫
(4)whatis數據庫建立
(5)RPM軟件登錄文件的建立
(6)移除暫存檔,tmpwatch指令來刪除暫存檔
(7)與網絡服務有關的分析行爲
二、僅執行一次的工作排程
1,atd的啓動與at運行的方式
(1)atd啓動
# yum安裝atd服務
yum install -y at
# 啓動atd服務
/etc/init.d/atd restart
# 設置開機啓動項
chkconfig atd on
(2)at運行流程
a)at指令編寫要進行的任務
b)將任務以文本方式寫入/vat/spool/at目錄內
c)該任務就可以等待atd服務調用和執行
(3)at的安全限制
利用/etc/at.allow和/etc/at.deny倆個文件限制可以進行at的使用
a)先查詢/etc/at.allow文件,如果有才能使用at,否則不能使用at(即使沒有寫在at.deny中)
b)如果/etc/at.allow不存在,就尋找/etc/at.deny這個文件,若寫在這個at.deny的使用者則不能使用at,而沒有在這個at.deny文件中的使用者,就可以使用at
c)如果這倆個文件都不存在,那麼只有root可以使用 at這個指令
2,實際運行單一工作排程
(1)語法:
at [-mldv] TIME
at -c 工作號碼
選項與參數:
-m :當at的工作完成後,即使沒有輸出信息,也會以email通知使用者該工作已完成。
-l :at -l 相當於atq,列出目前系統上面得所有該用戶的 at 排程;
-d :at -d 相當於 atrm ,可以取消一個在 at 排程中的工作;
-v :可以使用較明顯的時間格式列出 at 排程中的任務;
-c :可以列出後面接的該項工作的實際指令內容。
TIME:時間格式,這裏可以定義出什麼時候要進行 at 工作的時間
格式有:
HH:MM 在今日的 HH:MM 時刻進行,若該時刻已超過,則明天的 HH:MM 進行此工作 ex> 04:00
HH:MM YYYY-MM-DD 強制指定時間進行執行任務 ex> 04:00 2016-03-17
HH:MM[am|pm] [Month] [Date] 強制指定時間進行執行任務 ex> 04pm March 17
HH:MM[am|pm] + number [minutes|hours|days|weeks] 在某個時間點再加幾個時間後執行任務
ex> now + 5 minutes
ex> 04pm + 3 days
(2)at管理
atq
atrm [jobnumber]
(3)例子:
a)再過五分鐘後,將 /root/.bashrc 寄給 root 自己
at now + 5 minutes
at> /bin/mail root -s "testing at job" < /root/.bashrc
at> <EOT>
job 4 at 2016-03-17 15:38
# 上面這行信息在說明,第 4 個 at 工作將在 2016/03/17 的 15:38 執行任務
b)將上面的第 4 項工作內容列出來查看
at -c 4
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
(4)常用環境
a)脫機繼續工作的任務
b)用於突發狀況,
(5)batch:系統有空時才進行背景任務(會在 CPU 工作負載小於 0.8 的時)
使用方式和at一樣
三,循環執行的例行性 工作排程
1,使用者的設置
使用者想要建立循環型工作排程時,使用的是 crontab 命令;
限制使用 crontab 的使用者賬號:
/etc/cron.allow:將可以使用 crontab 的賬號寫入其中,若不在則不能使用 crontab;
/etc/cron.deny:記錄不可以使用 crontab 的賬號,若未記錄、就可以使用crontab 。
說明:
當用戶使用crontab創建計劃任務後,會被記錄到/var/spool/cron裏面,以用戶名創建文件。
例如,test用戶使用crontab後,工作會 被記錄到/var/spool/cron/test裏
cron執行的計劃任務會 記錄到 /var/log/cron日誌文件中
2,語法:
crontab [-u username] [-l|-e|-r]
選項不參數:
-u :只有 root 才能執行,即幫其他使用者創建/刪除 crontab 計劃任務
-e :編輯 crontab 的工作內容
-l :查閱 crontab 的工作內容
-r :刪除所有的 crontab計劃任務,若僅要刪除一項,請用 -e 去編輯。
例如:
# crontab -l
*/5 * * * * /bin/sh /home/maintain/subsistence.sh >/dev/null 2>&1
0 2 * * * /usr/sbin/ntpdate -u clepsydra.dec.com tick.ucla.edu ntp.nasa.gov
代表意義 | 分鐘 | 小時 | 日期 | 月份 | 周 | 命令 |
數字範圍 | 0-59 | 0-23 | 1-31 | 1-12 | 0-7(0和7都爲星期日) | command |
說明 :
特殊字符 | 代表意義 |
*(星號) | 任何時刻 |
,(逗號) | 代表分隔時段。如計劃任務是3:00和6:00時,就會是:0 3,6 * * * command |
-(減號) | 代表一段時間範圍內,如8點到12點之間的每小時的20分執行,20 8-12 * * * command |
/n(斜線) | 每隔n單位間隔,例如每五分鐘執行一次,則:*/5 * * * * command 也可以寫成 0-59/5 |
3,系統的配置文件: /etc/crontab
crontab -e是針對使用者的cron
/etc/crontab 是對系統的例行性任務
cron服務最低間隔爲分鐘,所以cron會每分鐘去讀取一次/etc/crontab與/var/spool/cron目錄
(1)/etc/crontab文件內容
# 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
(2)run-parts腳本內容
# cat /usr/bin/run-parts
#!/bin/bash
# run-parts - concept taken from Debian
# keep going when something fails
set +e
if [ $# -lt 1 ]; then
echo "Usage: run-parts <dir>"
exit 1
fi
if [ ! -d $1 ]; then
echo "Not a directory: $1"
exit 1
fi
# Ignore *~ and *, scripts
for i in $1/*[^~,] ; do
[ -d $i ] && continue
# Don't run *.{rpmsave,rpmorig,rpmnew,swp} scripts
[ "${i%.rpmsave}" != "${i}" ] && continue
[ "${i%.rpmorig}" != "${i}" ] && continue
[ "${i%.rpmnew}" != "${i}" ] && continue
[ "${i%.swp}" != "${i}" ] && continue
[ "${i%,v}" != "${i}" ] && continue
if [ -x $i ]; then
$i 2>&1 | awk -v "progname=$i" \
'progname {
print progname ":\n"
progname="";
}
{ print; }'
fi
done
exit 0
(3)根據run-parts這個script腳本,所以/etc/crontab文件裏面支持倆種方式:
a)命令文件:
0 2 * * * /usr/sbin/ntpdate -u clepsydra.dec.com tick.ucla.edu ntp.nasa.gov
b)按照目錄:
02 4 * * * root run-parts /etc/cron.daily
4,注意事項
(1)資源分配不均的問題
vi /etc/crontab
1,6,11,16,21,26,31,36,41,46,51,56 * * * * root CMD1
2,7,12,17,22,27,32,37,42,47,52,57 * * * * root CMD2
3,8,13,18,23,28,33,38,43,48,53,58 * * * * root CMD3
4,9,14,19,24,29,34,39,44,49,54,59 * * * * root CMD4
(2)取消不要的輸出信息
>/dev/null 2>&1
(3)安全檢驗,/var/spool/cron
(4)周與日月不可同時存在
(5)儘量使用全路徑
四,可喚醒停機期間的工作任務
1,什麼是 anacron?
anacron 不是用來取代 crontab 的,anacron 存在的目的是處理非 24 小時一直運行的 Linux 系統的crontab 執行,是以天爲單位或者是在開機後立刻進行 anacron 的動作,它會去檢查停機期間應該進行但是並沒有進行的crontab 務,並將該任務執行一遍後,anacron 就會自動停止。
timestamps是anacron 讀取的時間記錄文件;anacron 會去分析現在的時間與時間記錄文件記錄的上次執行 anacron 的時間,兩者比較後若發現有差異, 那就是在某些時刻沒有進行 crontab !此時 anacron 就會開始執行未進行的crontab 任務了! 所以 anacron 其實也是透過 crontab 來運行的!因此 anacron 運作的時間通常有兩個,一個是系統開機期間運行,一個是寫入 crontab 的排程中。 這樣才能夠在特定時間分析系統未進行的 crontab 任務
2,anacron 與 /etc/anacrontab
anacron是一個程序並非一個服務,在CentOS中已經進入crontab中
# ll /etc/cron*/*ana*
-rwxr-xr-x 1 root root 379 Mar 28 2007 /etc/cron.daily/0anacron
-rwxr-xr-x 1 root root 381 Mar 28 2007 /etc/cron.monthly/0anacron
-rwxr-xr-x 1 root root 380 Mar 28 2007 /etc/cron.weekly/0anacron
# cat /etc/cron.daily/0anacron
#!/bin/sh
#
# anacron's cron script
#
# This script updates anacron time stamps. It is called through run-parts
# either by anacron itself or by cron.
#
# The script is called "0anacron" to assure that it will be executed
# _before_ all other scripts.
# Don't run anacron if this script is called by anacron.
if [ ! -e /var/run/anacron.pid ]; then
anacron -u cron.daily
fi
3,語法:
anacron [-sfn] [job]..
anacron -u [job]..
選項與參數:
-s :開始一連續的執行各項工作 (job),會依據時間記錄文件的數據判斷是否進行
-f :強制進行,而不去判斷時間記錄文件的時間戳;
-n :立刻進行未進行的任務,而不延遲 (delay) 等待時間;
-u :僅更新時間記錄文件的時間戳,不進行任何工作。
job :由 /etc/anacrontab 定義的各項工作名稱。
# /etc/anacrontab 內容
# cat /etc/anacrontab
# /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
1 65 cron.daily run-parts /etc/cron.daily
7 70 cron.weekly run-parts /etc/cron.weekly
30 75 cron.monthly run-parts /etc/cron.monthly
天數 延遲時間 工作名稱定義 實際要執行的命令
# more /var/spool/anacron/*
::::::::::::::
/var/spool/anacron/cron.daily
::::::::::::::
20171206
::::::::::::::
/var/spool/anacron/cron.monthly
::::::::::::::
20171201
::::::::::::::
/var/spool/anacron/cron.weekly
::::::::::::::
20171203
3,工作流程
(1)由 /etc/anacrontab 分析到 cron.daily 這項工作名稱的天數爲 1 天;
(2)由 /var/spool/anacron/cron.daily 取出最近一次執行 anacron 的時間戳;
(3)由上個步驟不目前的時間比較,若差異天數爲 1 天以上 ,就準備及進行執行;
(4)若準備進行執行,根據 /etc/anacrontab 的設置,將延遲 65 分鐘
(5)延遲時間過後,開始執行後續命令,也就是 run-parts /etc/cron.daily;
(6)執行完畢後, anacron 程序結束
保證anacron開機進行
chkconfig --list anacron