linux定時任務cron配置

版權聲明:本文爲博主原創文章,未經博主容許不得轉載。linux

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

名詞解釋:shell

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

軟件包安裝:apache

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

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*編碼

若是本地沒有安裝包,在可以連網的狀況下能夠在線安裝url

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下的文件),是針對某個用戶的.定時任務配置到任意一箇中均可以。

查看全局配置文件配置狀況: 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
----------------------------------------------

查看用戶下的定時任務:crontab -lcat /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 意味着整數 一、二、三、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
上面的例子表示每個月一、十、22日的4 : 45重啓apache。

10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每週6、週日的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 文件改變後就沒必要從新啓動守護進程了。

重啓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

 

網上查詢到的資料crontab不執行的問題:

第一,腳本的緣由:大多數狀況下,咱們要相信科學,相信計算機,不是有鬼,就是咱們的腳本的問題,這種問題致使crontab不能執行的機率佔到 70%以上。由於程序執行到某一步致使crontab終止執行,我就碰到一次在遷移代碼的時候將數據庫連錯了。致使沒法訪問而死在那裏了。

第二,執行環境問題,當咱們碰到第一狀況下,通常均可以經過手動執行程序將問題扼殺在搖籃裏,通常狀況下高手是不該該犯第一種錯誤的。問題是當咱們 手動執行成功而crontab不能執行的時候,筆者碰到一次就是執行環境的問題,例如相關路徑的設置問題。解決方案:在代碼最前面執行 source /home/user/.bash_profile

第三,系統時間不正確。這種問題最好理解,也是比較常見和隱蔽的問題,解決方案:date -s ********

第四,就是咱們的腳本是否有可執行權限。必須保證執行腳本的用戶有執行改文件的權限。

第五,crontab 守護進程死掉了。這種狀況是極少發生的,但也不排除,當咱們實在是找不到其餘緣由的時候能夠用。解決方案:重啓該進程。

第六,crontab不執行的問題困擾了好長時間,腳本寫的都正確,可是就是不執行,最終解決方法以下:
        crontab -u root /var/spool/cron/root
        這樣root用戶的crontab就生效了
        service crond restart
        重啓下服務就行了

第七,crond沒有啓動

第八,腳本編碼問題,腳本在window下編寫,傳到linux下後報鍩?!/bin/bash」,用vi編輯器新建新shell腳本,輸入內容後保存。

相關文章
相關標籤/搜索