Linux學習——crontab定時任務

實現linux定時任務有: cron、anacron、at等,這裏主要介紹cron服務。

名詞解釋:

   cron是服務名稱,crond是後臺進程,crontab則是定製好的計劃任務表。

   crontab命令用於設置週期性被執行的指令。該命令從標準輸入設備讀取指令,並將其存放於“crontab”文件中,以供之後讀取和執行。

   cron 系統調度進程。 可以使用它在每天的非高峯負荷時間段運行作業,或在一週或一月中的不同時段運行。cron是系統主要的調度進程,可以在無需人工干預的情況下運行作業。crontab命令允許用戶提交、編輯或刪除相應的作業。每一個用戶都可以有一個crontab文件來保存調度信息。系統管理員可以通過cron.deny 和 cron.allow 這兩個文件來禁止或允許用戶擁有自己的crontab文件。

軟件包安裝:

要使用cron服務,先要安裝vixie-cron軟件包和crontabs軟件包,兩個軟件包作用如下:

vixie-cron軟件包是cron的主程序。
crontabs軟件包是用來安裝、卸裝、或列舉用來驅動 cron 守護進程的表格的程序。

查看是否安裝了cron軟件包: rpm -qa|grep vixie-cron

查看是否安裝了crontabs軟件包:rpm -qa|grep crontabs

如果沒有安裝,則執行如下命令安裝軟件包(軟件包必須存在)
rpm -ivh vixie-cron-4.1-54.FC5*
rpm -ivh crontabs*

如果本地沒有安裝包,在能夠連網的情況下可以在線安裝

yum install vixie-cron
yum install crontabs

查看crond服務是否運行:

pgrep crond

/sbin/service crond status

ps -elf|grep crond|grep -v "grep"

crond服務操作命令:

/sbin/service crond start //啓動服務  
/sbin/service crond stop //關閉服務  
/sbin/service crond restart //重啓服務  
/sbin/service crond reload //重新載入配置

配置定時任務:

cron有兩個配置文件,一個是一個全局配置文件(/etc/crontab),是針對系統任務的;一組是crontab命令生成的配置文件(/var/spool/cron下的文件),是針對某個用戶的.定時任務配置到任意一箇中都可以。

1:查看全局配置文件配置情況: 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:每個用戶都會生成一個自動生成一個自己的crontab文件,一般位於/var/spool/cron目錄下

[root@localhost cron]# cd /var/spool/cron

[root@localhost cron]# ls

oracle root

如果你用命令crontab -r 就會刪除當前用戶的crontab文件,例如你切換到oracle賬號下,執行了該命令,那麼/var/spool/cron/oracle文件就會刪除,如果要創建該文件只需要用crontab -e命令即可。注意,普通用戶一般沒有權限訪問/var/spool/cron

3:cron.deny 與 cron.allow文件

/etc/cron.deny 表示不能使用crontab 命令的用戶

/etc/cron.allow 表示能使用crontab的用戶。

默認情況下,cron.allow文件不存在。如果兩個文件同時存在,那麼/etc/cron.allow 優先。如果兩個文件都不存在,那麼只有超級用戶可以安排作業。

但是讓人納悶的是cron.deny文件是空的,如下所示

[oracle@localhost etc]$ more cron.deny

4:cron.hourly,cron.daily,cron.monthly,cron.weekly


查看用戶下的定時任務:crontab -l或cat /var/spool/cron/用戶名

crontab任務配置基本格式:
*   *  *  *  *  command
分鐘(0-59) 小時(0-23) 日期(1-31) 月份(1-12) 星期(0-6,0代表星期天)  命令

第1列表示分鐘1~59 每分鐘用*或者 */1表示
第2列表示小時1~23(0表示0點)
第3列表示日期1~31
第4列表示月份1~12
第5列標識號星期0~6(0表示星期天)
第6列要運行的命令

在以上任何值中,星號(*)可以用來代表所有有效的值。譬如,月份值中的星號意味着在滿足其它制約條件後每月都執行該命令。
整數間的短線(-)指定一個整數範圍。譬如,1-4 意味着整數 1、2、3、4。
用逗號(,)隔開的一系列值指定一個列表。譬如,3, 4, 6, 8 標明這四個指定的整數。
正斜線(/)可以用來指定間隔頻率。在範圍後加上 /<integer> 意味着在範圍內可以跳過 integer。譬如,0-59/2 可以用來在分鐘字段定義每兩分鐘。間隔頻率值還可以和星號一起使用。例如,*/3 的值可以用在月份字段中表示每三個月運行一次任務。
開頭爲井號(#)的行是註釋,不會被處理。 


例子:

0 1 * * * /home/testuser/test.sh
每天晚上1點調用/home/testuser/test.sh

*/10 * * * * /home/testuser/test.sh
每10鐘調用一次/home/testuser/test.sh

30 21 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每晚的21:30重啓apache。

45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每月1、10、22日的4 : 45重啓apache。

10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每週六、週日的1 : 10重啓apache。

0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示在每天18 : 00至23 : 00之間每隔30分鐘重啓apache。

0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每星期六的11 : 00 pm重啓apache。

* */1 * * * /usr/local/etc/rc.d/lighttpd restart
每一小時重啓apache

* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
晚上11點到早上7點之間,每隔一小時重啓apache

0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
每月的4號與每週一到週三的11點重啓apache

0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
一月一號的4點重啓apache

*/30 * * * * /usr/sbin/ntpdate 210.72.145.44
每半小時同步一下時間

配置用戶定時任務的語法:

crontab [-u user]file

crontab [-u user] [-l| -r | -e][-i]

參數與說明:

crontab -u//設定某個用戶的cron服務

crontab -l//列出某個用戶cron服務的詳細內容

crontab -r//刪除沒個用戶的cron服務

crontab -e//編輯某個用戶的cron服務


例子:

假設當前用戶是root,要建立root用戶的定時任務

crontab -e

選擇編輯器,編輯定時任務(這裏假設是編輯器是vi)

按i進入編輯模式

0 1 * * * /root/test.sh

按esc退出編輯模式進入普通模式,輸入:x或:wq保存退出

查看剛剛輸入的定時任務

crontab -lcat /var/spool/cron/root

根用戶以外的用戶可以使用 crontab 工具來配置 cron 任務。所有用戶定義的 crontab 都被保存在 /var/spool/cron 目錄中,並使用創建它們的用戶身份來執行。要以某用戶身份創建一個 crontab 項目,登錄爲該用戶,然後鍵入 crontab -e 命令,使用由 VISUAL 或 EDITOR 環境變量指定的編輯器來編輯該用戶的 crontab。該文件使用的格式和 /etc/crontab 相同。當對 crontab 所做的改變被保存後,該 crontab 文件就會根據該用戶名被保存,並寫入文件 /var/spool/cron/username 中。
      cron 守護進程每分鐘都檢查 /etc/crontab 文件、etc/cron.d/ 目錄、以及 /var/spool/cron 目錄中的改變。如果發現了改變,它們就會被載入內存。這樣,當某個 crontab 文件改變後就不必重新啓動守護進程了。

1:查看當前用戶的定時任務

[oracle@localhost ~]$ crontab -l

* * * * * /home/oracle/test.sh >/dev/null 2>&1

2:編輯當前用戶的定時任務

 

可以在編輯狀態修改、刪除、新增一些定時任務。註釋一般用#

[oracle@localhost ~]$ crontab -e

3:刪除當前用戶的定時任務

[root@localhost ~]# crontab -r

[root@localhost ~]# crontab -l

no crontab for root

4:

 

如下所示,一般crontab文件裏面的定時任務格式如下所示:

59 23 * * * /home/oracle/scripts/alert_log_archive.sh >/dev/null 2>&1

crontab 文件中每個條目中各個域的意義和格式:

第一列 分鐘: 1——59

第二列 小時: 1——23(0表示子夜)

第三列 日 : 1——31

第四列 月 : 1——12

第五列 星期: 星期0——6(0表示星期天,1表示星期一、以此類推)

第六列 要運行的命令

我們暫且用C1、C2、C3、C4、C5、C6代表這六列,前面五列通過組合方式來決定執行腳本的頻率,最小頻率爲每分鐘執行一次,其中Cn可以用 * ; */n ; T1-T2; a,b,c; 四種形式來表示:

當 C1 爲 * 時表示每分鐘都要執行腳本,C2 爲 * 時表示每小時都要執行程式,依次類推.....

當 C1 爲 T1-T2 時表示從第 T1 分鐘到第 T2 分鐘這段時間內要執行,C2 爲 T1-T2 時表示從第 T1 到第 T2 小時都要執行,依次類推....

當 C1 爲 */n 時表示每 n 分鐘的時間間隔執行一次,C2 爲 */n 表示每隔n小時的間隔執行一次,依次類推.....

當 C1 爲 a, b, c,... 時表示第 a, b, c,... 分鐘要執行,C2 爲 a, b, c,... 時表示第 a, b, c...個小時要執行,依次類推....

下面列舉幾個例子供大家參考

1: 59 23 * * * /home/oracle/scripts/alert_log_archive.sh >/dev/null 2>&1

表示每天23點59分執行腳本/home/oracle/scripts/alert_log_archive.sh

2: */5 * * * * /home/oracle/scripts/monitoring_alert_log.sh >/dev/null 2>&1

表示每5分鐘執行一次腳本/home/oracle/scripts/monitoring_alert_log.sh

3: 0 20 * * 1-5 mail -s "**********" [email protected] < /tmp/maildata

週一到週五每天下午 20:00 寄一封信給 [email protected]

..............................................

關於 >/dev/null 2>&1 的解釋:

0表示鍵盤輸入

1表示標準輸出

2表示錯誤輸出.

我們首先創建test.sh腳本如下:

#! /bin/sh

echo "hello, everybody, now is " `date`

date >> test.txt

然後添加作業

* * * * * /home/oracle/test.sh >/home/oracle/log.txt & 默認值爲1,即和下面命令一致

* * * * * /home/oracle/test.sh 1>/home/oracle/log.txt &

* * * * * /home/oracle/test.sh 2>/home/oracle/log.txt &

* * * * * /home/oracle/test.sh 2>/home/oracle/log.txt 2>&1 &

1,2將tesh.sh 命令輸出重定向到log.txt, 即輸出內容不打印到屏幕上,而是輸出到log.txt文件中。如果你需要追加而不是覆蓋,可以用 >>代替>

2>&1 是將錯誤輸出重定向到標準輸出。 然後將標準輸入重定向到文件log.txt。

&1 表示的是文件描述1,表示標準輸出,如果這裏少了&就成了數字1,就表示重定向到文件1。

注意事項:

配置定時任務時,需要注意兩個問題:

1: 在SHELL中設置了必要的環境變量;例如一個shell腳本手工執行OK,但是配置成後臺作業執行時,獲取不到ORACLE的環境變量,這是因爲crontab環境變量問題,Crontab的環境默認情況下並不包含系統中當前用戶的環境。所以,你需要在shell腳本中添加必要的環境變量的設置

2: 儘量所有的文件都採用完全路徑方式,避免使用相對路徑。



重啓crond:

/sbin/service crond restart

查看cron服務是否起作用:

如果我們要查看定時任務是否準時調用了可以/var/log/cron中的運行信息

cat /var/log/cron

grep .*\.sh /var/log/cron

搜索.sh類型文件信息

sed -n '/back.*\.sh/p' /var/log/cron
格式sed -n '/字符或正則表達式/p' 文件名

我們在日誌中查看在約定的時間是否有相應的調用信息,調用信息類似:

Sep 19 1:00:01 localhost crond[25437]: (root) CMD (/root/test.sh)

查看shell腳本是否報錯:

如果/var/log/cron中準時調用了shell腳本,而又沒有達到預期結果,我們就要懷疑shell腳本是否出錯

cat /var/spool/mail/用戶名

例子:

cat /var/spool/mail/root


test.sh

-------------------------

#!/bin/sh

echo "$(date '+%Y-%m-%d %H:%M:%S') hello world!" >> /root/test.log

-------------------------

要追蹤shell調用的全過程:

bash -xv test.sh 2>test.log

test.sh的調用過程都會寫到test.log中

改寫test.sh

-------------------------

#!/bin/sh

set -xv

echo "$(date '+%Y-%m-%d %H:%M:%S') hello world!" >> /root/test.log

-------------------------

sh ./test.sh 2>tt.log


本文參照如下博客鏈接:http://blog.csdn.net/jbgtwang/article/details/7995801

                                        http://www.cnblogs.com/kerrycode/p/3238346.html



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章