1. 程式人生 > >例行性工作 排程(crontab)

例行性工作 排程(crontab)

計劃任務 crond crontab

一,什麽是例行性工作排程?

計劃任務:比如每天,每周,每月,每年或者指定時間需要執行的工作任務

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-590-231-311-120-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




例行性工作 排程(crontab)