CentOS7計劃任務crontab

一、計劃任務的基本概念

linux系統採用crond守護進程來控制系統和用戶的計劃任務,實現週期性的執行某種任務或處理某些事件。

Linux系統本身就有很多的計劃任務,所以crond服務是默認安裝和啓動的。crond服務每分鐘都會檢查是否有需要執行的任務,如果有則自動執行該任務。執行以下命令可以看到crond服務的運行情況:

systemctl status crond

在這裏插入圖片描述

Linux下的計劃任務分爲兩種:用戶計劃任務和系統計劃任務。

二、用戶計劃任務

Linux的每個用戶可以定義自己的計劃任務,週期性的執行腳本或程序。計劃任務的內容存放在crontab文件中,每個用戶都有自己的crontab文件。

1、查看crontab文件

crontab -l [-u 用戶名]

root用戶可以用-u參數查看指定用戶的計劃任務,如果沒有-u參數,表示查看自己的計劃任務。普通用戶只查看自己的計劃任務,不允許使用-u參數。

2、編輯crontab文件

crontab -e [-u 用戶名]

root用戶可以用-u參數編輯指定用戶的計劃任務,如果沒有-u參數,表示編輯自己的計劃任務。普通用戶只能編輯自己的計劃任務,不允許使用-u參數。crontab缺省的編輯工具是vi。

3、刪除crontab文件

crontab -r [-u 用戶名]

root用戶可以用-u參數刪除指定用戶的計劃任務,如果沒有-u參數,表示刪除自己的計劃任務。普通用戶只刪除自己的計劃任務,不允許使用-u參數。

4、crontab文件格式

在這裏插入圖片描述
crontab文件中的每個任務由兩部分組成,執行時間和執行命令。

1)執行時間,有5個參數:

第1部分:分鐘(minute),取值0-59。

第2部分:小時(hour),取值0-23。

第3部分:月當中的天(day of month),取值1-31,。

第4部分:月份(month),取值1-12,或採用月份單詞的英文簡寫。

第5部分:星期中的天(day of week),取值0-6,或採用星期單詞的英文簡寫。

在以上各部分中,還可以使用以下特殊字符:

星號(*):代表全部的值,例如day of month字段如果是星號,則表示在滿足其它字段的制約條件後每天執行該任務。

逗號(,):可以用逗號分隔開的值指定一個列表,例如,“1,2,5,7,8,9”。

中槓(-):可以中槓表示一個範圍,例如“2-6”表示“2,3,4,5,6”。

正斜線(/):可以用正斜線指定時間的間隔頻率,例如minute字段,“0-30/5”表示在0-30的範圍內每5分鐘執行一次;“*/5”表示每十分鐘執行一次。

2)執行命令:任務執行的程序,可以是shell腳本,也可以是其它的可執行文件,但是要注意幾個問題:

a)crontab中執行程序的時候,不會先執行系統和用戶的環境變量文件,如果待執行的程序需要環境變量,程序將無法執行;

b)crontab中執行的程序必須採用全路徑。

5、crontab示例

1)每兩分鐘執行一次date命令,結果輸出到/tmp/date.log文件(下同)。

*/2 * * * * /usr/bin/date \> /tmp/date.log

2)在每個小時的05、10、15分執行一次date命令。

5,10,15 * * * * /usr/bin/date \> /tmp/date.log

3)在每個小時20-30分之間的每一分鐘執行一次date命令。

20-30 * * * * /usr/bin/date \> /tmp/date.log

4)在每天的10:30分執行一次date命令。

30 10 * * * /usr/bin/date \> /tmp/date.log

5)在每個月1號的02:30分執行一次date命令。

30 02 1 * * /usr/bin/date \> /tmp/date.log

6)在每星期天的02:30分執行一次date命令。

30 02 * * 0 /usr/bin/date \> /tmp/date.log

三、系統計劃任務

網上很多文章認爲系統計劃任務是執行系統級別的週期性任務,例如系統備份、把緩存數據寫入硬盤、清理日誌文件等。這些說法有些片面,我不這麼認爲,我先介紹系統計劃任務的相關知識,然後通過示例來演示。

系統計劃任務在/etc/crontab文件配置,以下缺省/etc/crontab文件的內容:
在這裏插入圖片描述
系統計劃任務的/etc/crontab文件中,可以設置環境變量,可以指定執行任務的用戶。系統計劃任務的執行時間的與用戶計劃任務的執行時間含義相同,不再描述。

示例:

Oracle數據庫提供了sqlplus工具,執行sqlplus需要環境變量,如ORACLE_HOME、ORACLE_BASE等,如果採用系統計劃任務執行一個SQL腳本,步驟如下:

1)準備/tmp/test.sql腳本文件,內容如下:

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;

exit;

2)在/etc/crontab文件中增加環境變量和任務,如下:

# 設置Oracle的環境變量。
ORACLE_BASE=/oracle/base
ORACLE_HOME=/oracle/home
ORACLE_SID=snorcl11g
NLS_LANG='Simplified Chinese_China.ZHS16GBK'
LD_LIBRARY_PATH=\$ORACLE_HOME/lib:/usr/lib

# 每分鐘調用sqlplus執行/tmp/test.sql腳本,結果輸出到/tmp/test.log文件。
*/1 * * * * oracle /oracle/home/bin/sqlplus scott/tiger @/tmp/test.sql >/tmp/test.log

3)每隔一分鐘查看/tmp/test.log文件的內容,如下:
在這裏插入圖片描述

四、如何在用戶計劃任務中執行需要環境變量的程序

用戶的計劃任務無法設置環境變量,那麼如何在用戶計劃任務中執行需要環境變量的程序呢?我們可以這麼做:

1)編寫一個shell腳本;

2)在腳本中設置環境變量;

3)在腳本中執行需要環境變量的程序。

示例:

1)編寫/tmp/test.sh腳本文件,內容如下:

# 設置系統環境變量。
source /etc/profile
# 設置oracle用戶的環境變量。
source /oracle/.bash_profile
# 執行/tmp/test.sql腳本。
/oracle/home/bin/sqlplus scott/tiger @/tmp/test.sql > /tmp/test1.log

2)準備/tmp/test.sql腳本文件,內容如下:

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
exit;

3)設置oracle用戶的計劃任務文件,內容如下:

# 每分鐘執行一次/tmp/test.sh腳本。
*/1 * * * * /bin/sh /tmp/test.sh

4)每隔一分鐘查看/tmp/test1.log文件的內容,如下:
在這裏插入圖片描述

五、應用經驗

用戶計劃任務和系統計劃任務沒有本質的區別,都可以達到相同的目的。

在實際項目中我偏向用戶的計劃任務,雖然用戶計劃任務的crontab文件中不能設置環境變量,但可以通過腳本文件來解決,並且,腳本文件中編寫指令比crontab文件更靈活。

六、版權聲明

C語言技術網原創文章,轉載請說明文章的來源、作者和原文的鏈接。

來源:C語言技術網(www.freecplus.net

作者:碼農有道

如果這篇文章對您有幫助,請點贊支持,或在您的博客中轉發我的文章,謝謝!!!
如果文章有錯別字,或者內容有錯誤,或其他的建議和意見,請您留言指正,非常感謝!!!

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