1. 程式人生 > >Linux中的計劃任務—Crontab排程重複執行的任務

Linux中的計劃任務—Crontab排程重複執行的任務

目標

本博文的主要目的是讓筆者和讀者可以瞭解並掌握以下內容:
1、Crontab的基本概念
2、Crontab的基本組成
3、操作Crond服務
4、配置系統和使用者計劃任務
5、監控計劃任務日誌

背景介紹

這裡寫圖片描述

在工作中你是否也碰到過這種定時重複的工作呢?

Crontab可以幫助你從這些定時重複的工作中解脫出來

Crontab是什麼

這裡寫圖片描述

  • 1.Crontab是一個用於設定週期性執行任務的工具;
  • 2.週期性執行的任務我們稱為Cron Job;
  • 3.週期性執行的任務列表我們稱為Cron Table。

Crontab實踐

安裝並檢查Crontab服務

安裝並檢查crontab服務

1、檢查cron服務:

– 檢查crontab工具是否安裝:crontab -l
– 檢查crond服務是否啟動:service crond status

2、安裝cron

– yum install vixie-cron
– yum install crontabs
注意:
1、檢查crontab服務狀態:service crond status
控制服務的一些提示:service crond
2、檢查Apache(阿帕奇)服務狀態:service httpd status
控制服務的一些提示:service httpd
(檢查服務狀態,服務名後面一般都加d,如crond、httpd)

這裡寫圖片描述

案例實現

每分鐘都列印當前時間到一個檔案中

service crond status #檢視服務是否啟動<br>

service crond start #如沒有啟動服務,啟動服務<br>

crontab -l  #檢視當前定時任務列表<br>

crontab -e  #開啟定時任務列表檔案,進行編輯<br>

*/1 * * * * date >> /tmp/log.txt    #在最後一行插入內容,儲存退出(注意*間的空格)<br>

tail -f /tmp/log.txt    #監聽log.txt檔案內容(動態重新整理)
date #檢視當前時間

Crontab的基本組成

這裡寫圖片描述

crontab的基本組成:

  • 1)系統服務CROND:
    每分鐘都會從配置檔案重新整理定時任務
  • 2)配置檔案:
    檔案方式設定定時任務
  • 3)配置工具crontab:
    用於調整定時任務

Crontab的配置檔案格式

這裡寫圖片描述

小栗子

eg1.每晚的21:30重啟apache

30 21 * * * service httpd restart

eg2.每月1,10,22日的4:45重啟apache

45 4 1,10,22 * * service httpd restart

eg3.每月1-10日的4:45重啟apache

45 4 1-10 * * service httpd restart

eg4.每隔兩分鐘重啟apache

*/2 * * * * service httpd restart
1-59/2 * * * * service httpd restart(奇數分鐘重啟)
 0-58/2 * * * * service httpd restart(偶數分鐘重啟)

eg5.每晚11-早上7點之間,每隔一個小時重啟apache

* 23-7/1 * * * service httpd restart

eg6.每天18:00-23:00之間每隔30分鐘重啟apache

0,30 18-23 * * * service httpd restart
0-59/30 18-23 * * * service httpd restart

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

這裡寫圖片描述

Crontab工具的使用

通過 man crontab 或者 crontab --help 檢視

1、檢視某使用者的計劃任務列表:

    crontab -u 使用者名稱 -l(預設-u為當前登入使用者)

2、修改某使用者的計劃任務:

    crontab -e

3、刪除crontab檔案

crontab -r [username]

root可以指定使用者刪除其他使用者的crontab檔案。 其他使用者只可以刪除自己的crontab檔案

4、檢視生成的最終計劃任務檔案:

/var/spool/cron

5、crontab日誌位置:

/var/log/cron

Crontab的配置檔案

這裡寫圖片描述

1、使用者的crontab定時任務儲存檔案:
/var/spool/cron/root
或者:/var/spool/cron/tabs/root
2、全域性(系統)配置檔案:
– /etc/crontab
– 注意格式

1.利用命令crontab -e 進入的是使用者級別的計劃任務
2.用 vi /etc/crontab 進入後編輯的是系統級的計劃任務

這裡寫圖片描述

cd /etc
ls cron*
tail -f /var/log/cron(任務執行日誌)
crontab -e實際上是在修改目錄/var/spool/cron/root下的使用者對應的檔案
cd /etc/cron.d
vi sysstat
crontab sysstat
crontab 檔名 會把(crontab -e)檔案裡的內容都覆蓋 ,所以要非常小心

crontab -l -u crontester查詢某個使用者下的定時程式
cron.d可以認為是對系統級配置的補充,crontab -l,crontab -e看不到,編輯不了cron.d裡的配置

可以在該資料夾下自己建立 
vi crontest
*/1 * * * * echo 'file in cron.d/crontest'
tail -f /var/log/cron

Crontab的日誌

  • /var/log/cron 儲存著所有的crontab的操作
  • /var/spool/mail/ 下也會以郵件的方式傳送日誌資訊

Crontab的常見錯誤

Crontab的常見錯誤之環境變數

不可引用環境變數

cd ~

ls -a
可以看到有.bash_profile檔案

vim .bash_profile
新增一個環境變數

--------------
APPDIR=/ect
export APPDIR
-----------------

更新到環境變數:

source .bash_profile

檢驗:
echo $APPDIR 可以正常顯示,能夠被識別
但是在下面這條命令列新增在crontab裡不能被識別

*/1 * * * * echo $APPDIR >> /tmp/appdir.log

————————————————————————
在/var/log/cron任務執行日誌中可以看到,但是cat開啟/tmp/appdir.log內容是空的

Crontab的常見錯誤之命令列操作

  • 1、test 表示式 測試後面的表示式是否真實,但必須加空格 (如果不加空格,那麼該命令恆為正確的。)例如: test 1 = 0 如果結果是0 ,那麼是正確的(與C語言相反)
  • 2.通過echo $?來檢視上一次的執行結果。
  • 3、date +%w 這個是顯示今天是星期幾
  • 4、需要注意的是在crontab檔案中,%需要進行轉義

第三個和第五個域之間執行的是或操作 即 星期幾和每月幾號是或關係

例:4月的第一個星期日早晨1時59分執行a.sh

59 1 1-7 4 0 /root/a.sh 錯誤的寫法
59 1 1-7 4 * testdate +\%w-eq 0 && /root/a.sh 正確的寫法

這裡寫圖片描述

Crontab的常見錯誤之分鐘設定誤用

兩小時執行一次date命令

錯誤:

* 0,2,4,6,8,10,12,14,16,18,20,22 * * * date

正確:

0 */2 * * * date

Crontab綜合案例解析

這裡寫圖片描述

crontab最小時間是1分鐘,控制1分鐘執行多次
本應該是同時執行,但第二條被推遲了30s執行,效果就是1分鐘執行了2次

*/1 * * * * date>>/root/test/half.log
*/1 * * * * sleep 30s;date>>/root/test/half.log

&& 和|| 和 ;的區別

  • command1 && command2: &&左邊的command1執行成功(返回0表示成功)後,&&右邊的command2才能被執行。
  • command1 || command2: 如果||左邊的command1執行失敗(返回1表示失敗),就執行&&右邊的command2。
  • command1;command2: 命令順序執行,不管前面的是否正確後面的都會依次執行

定時備份oracle資料

#!/bin/bash
export ORACLE_BASE=/data/oracle
export ORACLE_HOME=/oracle/product/102
export ORACLE_SID=sidname
export ORACLE_TERM=xterm
export PATH=$ORACLE_HOME/bin:/usr/sbin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export LANG=C
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8



#以上程式碼為Oracle資料庫執行賬號oracle的系統環境變數設定,必須新增,否則crontab任務計劃不能執行。
date=date +%Y_%m_%d   #獲取系統當前日期時間
days=5  #設定刪除5天之前的備份檔案
orsid=ip:port/sidname #Oracle資料庫伺服器IP、埠、SID
orowner=master_ccpx2  #備份此使用者下面的資料
bakuser=master_ccpx2   #用此使用者來執行備份,必須要有備份操作的許可權
bakpass=passwd  #執行備註的使用者密碼
bakdir=/aaa/bbb/oracle_data  #備份檔案路徑,需要提前建立好
bakdata=$orowner"_"$date.dmp #備份資料庫名稱
baklog=$orowner"_"$date.log #備份執行時候生成的日誌檔名稱
ordatabak=$orowner"_"$date.tar.gz #最後儲存的Oracle資料庫備份檔案
cd $bakdir #進入備份目錄
mkdir -p $orowner #按需要備份的Oracle使用者建立目錄
cd $orowner #進入目錄
exp $bakuser/$bakpass@$orsid grants=y owner=$orowner file=$bakdir/$orowner/$bakdata log=$bakdir/$orowner/$baklog #執行備份
tar -zcvf $ordatabak $bakdata  $baklog  #壓縮備份檔案和日誌檔案
find $bakdir/$orowner  -type f -name "*.log" -exec rm {} \; #刪除備份檔案
find $bakdir/$orowner  -type f -name "*.dmp" -exec rm {} \; #刪除日誌檔案
find $bakdir/$orowner  -type f -name "*.tar.gz" -mtime +$days -exec rm -rf {} \;  #刪除5天前的備份