Linux 系統則是由 cron (crond) 這個系統服務來控制的。Linux 系統上面本來就有很是多的計劃性工做,所以這個系統服務是默認啓動的。另外, 因爲使用者本身也能夠設置計劃任務,因此, Linux 系統也提供了使用者控制計劃任務的命令 :crontab 命令。java
Crontab服務是Unix/Linux下的工業級服務,使用它能夠設置週期性的任務執行,不須要常駐程序,這對程序的要求高度以及系統的性能開銷起到積極做用。Crontab是Unix/
Linux下主要的調度進程,不需人工干擾下做業,而且其能夠容許用戶提交、編輯及刪除對應的任務做業,另外,每一個用戶都擁有一個Crontab文件保存調度信息,管理員能夠經過編輯cron.deny及c
ron.allow兩個文件禁止或許可用戶擁有Contab。
在 Linux/unix 下的 crontab 會自動的幫咱們每分鐘從新讀取一次 /etc/crontab 的例行工做事項,可是某些緣由或者是其餘的Unix/linux系統中,因爲crontab 是讀到內存當中的,因此在你修改完 /etc/crontab 以後,可能並不會立刻運行, 這個時候請從新啓動 crond 這個服務:/etc/init.d/crond restart。
crond 是linux下用來週期性的執行某種任務或等待處理某些事件的一個守護進程,與windows下的計劃任務相似,當安裝完成操做系統後,默認會安裝此服務 工具,而且會自動啓動crond進程,crond進程每分鐘會按期檢查是否有要執行的任務,若是有要執行的任務,則自動執行該任務。
Linux下的任務調度分爲兩類,系統任務調度和用戶任務調度。系統任務調度:系統週期性所要執行的工做,好比寫緩存數據到硬盤、日誌清理等。在/etc目錄下有一個crontab文件,這個就是系統任務調度的配置文件。linux
# 安裝crontab: yum install crontabs
# 服務操做說明: /sbin/service crond start //啓動服務 /sbin/service crond stop //關閉服務 /sbin/service crond restart //重啓服務 /sbin/service crond reload //從新載入配置 /sbin/service crond status //啓動服務
查看crontab服務是否已設置爲開機啓動,執行命令:sql
ntsysv
加入開機自動啓動:shell
chkconfig –level 35 crond on
1.命令格式:apache
crontab [-u user] file crontab [-u user] [ -e | -l | -r ]
2.命令功能:vim
經過crontab 命令,咱們能夠在固定的間隔時間執行指定的系統指令或 shell script腳本。時間間隔的單位能夠是分鐘、小時、日、月、周及以上的任意組合。這個命令很是設合週期性的日誌分析或數據備份等工做。windows
3.命令參數:緩存
-u user:用來設定某個用戶的crontab服務,例如,「-u ixdba」表示設定ixdba用戶的crontab服務, 此參數通常有root用戶來運行。 file:file是命令文件的名字,表示將file作爲crontab的任務列表文件並載入crontab。 若是在命令行中沒有指定這個文件,crontab命令將接受標準輸入(鍵盤)上鍵入的命令,並將它們載入crontab。 -e:編輯某個用戶的crontab文件內容。若是不指定用戶,則表示編輯當前用戶的crontab文件。 -l:顯示某個用戶的crontab文件內容,若是不指定用戶,則表示顯示當前用戶的crontab文件內容。 -r:從/var/spool/cron目錄中刪除某個用戶的crontab文件,若是不指定用戶,則默認刪除當前用戶的crontab文件。 -i:在刪除用戶的crontab文件時給確認提示。
4.經常使用方法:bash
1). 建立一個新的crontab文件oracle
在 考慮向cron進程提交一個crontab文件以前,首先要作的一件事情就是設置環境變量EDITOR。cron進程根據它來肯定使用哪一個編輯器編輯 crontab文件。9 9 %的UNIX和LINUX用戶都使用vi,若是你也是這樣,那麼你就編輯$ HOME目錄下的. profile文件,在其 中加入這樣一行:
EDITOR=vi; export EDITOR
而後保存並退出。不妨建立一個名爲<user> cron的文件,其中<user>是用戶名,例如, davecron。在該文件中加入以下的內容。
# (put your own initials here)echo the date to the console every # 15minutes between 6pm and 6am 0,15,30,45 18-06 * * * /bin/echo ‘date’ > /dev/console
保存並退出。確信前面5個域用空格分隔。
在 上面的例子中,系統將每隔1 5分鐘向控制檯輸出一次當前時間。若是系統崩潰或掛起,從最後所顯示的時間就能夠一眼看出系統是什麼時間中止工做的。在有些 系統中,用tty1來表示控制檯,能夠根據實際狀況對上面的例子進行相應的修改。爲了提交你剛剛建立的crontab文件,能夠把這個新建立的文件做爲 cron命令的參數:
$ crontab davecron
如今該文件已經提交給cron進程,它將每隔1 5分鐘運行一次。同時,新建立文件的一個副本已經被放在/var/spool/cron目錄中,文件名就是用戶名(即dave)。
2). 列出crontab文件
爲了列出crontab文件,能夠用:
$ crontab -l 0,15,30,45,18-06 * * * /bin/echo `date` > dev/tty1 你將會看到和上面相似的內容。可使用這種方法在$HOME目錄中對crontab文件作一備份: $ crontab -l > $HOME/mycron 這樣,一旦不當心誤刪了crontab文件,能夠用上述的方法迅速恢復。
3). 編輯crontab文件
若是但願添加、刪除或編輯crontab文件中的條目,而EDITOR環境變量又設置爲v i,那麼就能夠用v i來編輯crontab文件,相應的命令爲:
$ crontab -e
能夠像使用v i編輯其餘任何文件那樣修改crontab文件並退出。若是修改了某些條目或添加了新的條目,那麼在保存該文件時, cron會對其進行必要的完整性檢查。若是其中的某個域出現了超出容許範圍的值,它會提示你。
在編輯crontab文件時,沒準會加入新的條目。例如,加入下面的一條:
# DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month 30 3 1,7,14,21,26 * * /bin/find -name 「core’ -exec rm {} \;
如今保存並退出。最好在crontab文件的每個條目之上加入一條註釋,這樣就能夠知道它的功能、運行時間,更爲重要的是,知道這是哪位用戶的做業。
如今讓咱們使用前面講過的crontab -l命令列出它的所有信息:
$ crontab -l # (crondave installed on Tue May 4 13:07:43 1999) # DT:ech the date to the console every 30 minites 0,15,30,45 18-06 * * * /bin/echo `date` > /dev/tty1 # DT:delete core files,at 3.30am on 1,7,14,21,26,26 days of each month 30 3 1,7,14,21,26 * * /bin/find -name 「core’ -exec rm {} \;
4). 刪除crontab文件
# 要刪除crontab文件,能夠用: $ crontab -r
5). 恢復丟失的crontab文件
若是不當心誤刪了crontab文件,假設你在本身的$HOME目錄下還有一個備份, 那麼能夠將其拷貝到/var/spool/cron/<username>,其中<username>是用戶名。 若是因爲權限問題沒法完成拷貝,能夠用: $ crontab <filename> 其中,<filename>是你在$HOME目錄中副本的文件名。 我建議你在本身的$ H O M E目錄中保存一個該文件的副本。我就有過相似的經歷, 有數次誤刪了crontab文件(由於r鍵緊挨在e鍵的右邊)。這就是爲何有些系統文檔建議不要直接編輯crontab文件, 而是編輯該文件的一個副本,而後從新提交新的文件。 有些crontab的變體有些怪異,因此在使用crontab命令時要格外當心。若是遺漏了任何選項, crontab可能會打開一個空文件,或者看起來像是個空文件。這時敲delete鍵退出,不要按<Ctrl-D>, 不然你將丟失crontab文件。
5.使用實例
實例1:每1分鐘執行一次command 命令: * * * * * command 實例2:每小時的第3和第15分鐘執行 命令: 3,15 * * * * command 實例3:在上午8點到11點的第3和第15分鐘執行 命令: 3,15 8-11 * * * command 實例4:每隔兩天的上午8點到11點的第3和第15分鐘執行 命令: 3,15 8-11 */2 * * command 實例5:每一個星期一的上午8點到11點的第3和第15分鐘執行 命令: 3,15 8-11 * * 1 command 實例6:每晚的21:30重啓smb 命令: 30 21 * * * /etc/init.d/smb restart 實例7:每個月一、十、22日的4 : 45重啓smb 命令: 45 4 1,10,22 * * /etc/init.d/smb restart 實例8:每週6、週日的1 : 10重啓smb 命令: 10 1 * * 6,0 /etc/init.d/smb restart 實例9:天天18 : 00至23 : 00之間每隔30分鐘重啓smb 命令: 0,30 18-23 * * * /etc/init.d/smb restart 實例10:每星期六的晚上11 : 00 pm重啓smb 命令: 0 23 * * 6 /etc/init.d/smb restart 實例11:每一小時重啓smb 命令: * */1 * * * /etc/init.d/smb restart 實例12:晚上11點到早上7點之間,每隔一小時重啓smb 命令: * 23-7/1 * * * /etc/init.d/smb restart 實例13:每個月的4號與每週一到週三的11點重啓smb 命令: 0 11 4 * mon-wed /etc/init.d/smb restart 實例14:一月一號的4點重啓smb 命令: 0 4 1 jan * /etc/init.d/smb restart 實例15:每小時執行/etc/cron.hourly目錄內的腳本 命令: 01 * * * * root run-parts /etc/cron.hourly
說明:
run-parts這個參數了,若是去掉這個參數的話,後面就能夠寫要運行的某個腳本名,而不是目錄名了
sh腳本文件:test.sh #! /bin/sh su - oracle << EOF sqlplus test/test@test @"test.sql" sql腳本文件:test.sql insert into test_tb values (sysdate); crontab文件: 0,15,30,45 * * * * /apps/bin/test.sh
附crontab規則詳細實例 一、天天6:00執行 0 6 * * * root /home/mvp/osyunwei.sh 二、每週六凌晨4:00執行 0 4 * * 6 root /home/mvp/osyunwei.sh 三、每週六凌晨4:05執行 5 4 * * 6 root /home/mvp/osyunwei.sh 四、每週六凌晨4:15執行 15 4 * * 6 root /home/mvp/osyunwei.sh 五、每週六凌晨4:25執行 25 4 * * 6 root /home/mvp/osyunwei.sh 六、每週六凌晨4:35執行 35 4 * * 6 root /home/mvp/osyunwei.sh 七、每週六凌晨5:00執行 5 * * 6 root /home/mvp/osyunwei.sh 八、天天8:40執行 40 8 * * * root /home/mvp/osyunwei.sh 九、天天8:30執行 30 8 * * * root /home/mvp/osyunwei.sh 十、每週一到週五的11:41開始,每隔10分鐘執行一次 #值得借鑑 41,51 11 * * 1-5 root /home/mvp/osyunwei.sh 或者 1-59/10 12-23 * * 1-5 root /home/mvp/osyunwei.sh 十一、在天天的10:31開始,每隔2小時重複一次 31 10-23/2 * * * root /home/mvp/osyunwei.sh 十二、天天15:00執行 0 15 * * * root /home/mvp/osyunwei.sh 1三、天天的10:30開始,每隔2小時重複一次 30 10-23/2 * * * root /home/mvp/osyunwei.sh 1四、天天15:30執行 30 15 * * * root /home/mvp/osyunwei.sh 1五、天天17:50執行 50 17 * * * root /home/mvp/osyunwei.sh 1六、天天8:00執行 0 8 * * * root /home/mvp/osyunwei.sh 1七、天天18:00執行 0 18 * * * root /home/mvp/osyunwei.sh 1八、天天8:30執行 30 8 * * * root /home/mvp/osyunwei.sh 1九、天天20:30 30 20 * * * root /home/mvp/osyunwei.sh 20、每週一到週五2:00 0 2 * * 1-5 root /home/mvp/osyunwei.sh 2一、每週一到週五9:30 30 9 * * 1-5 root /home/mvp/osyunwei.sh 2二、每週一到週五8:00,每週一到週五9:00 0 8,9 * * 1-5 root /home/mvp/osyunwei.sh 2三、天天23:59 59 23 * * * root /home/mvp/osyunwei.sh 2四、每週六23:59 59 23 * * 6 root /home/mvp/osyunwei.sh 2五、天天0:30 30 0 * * * root /home/mvp/osyunwei.sh 2六、每週一到週五9:25到11:35之間、13:00到15:00之間,每隔10分鐘運行一次 分區段寫值得借鑑 25,35,45,55 9 * * 1-5 root /home/mvp/osyunwei.sh 5-59/10 10 * * 1-5 root /home/mvp/osyunwei.sh 5,15,25,35 11 * * 1-5 root /home/mvp/osyunwei.sh */10 13-15 * * 1-5 root /home/mvp/osyunwei.sh 2七、每週一到週五8:30、8:50、9:30、10:00、10:30、11:00、11:30、13:30、14:00、14:30、5:00分別執行一次 30,50 8 * * 1-5 root /home/mvp/osyunwei.sh 30 9 * * 1-5 root /home/mvp/osyunwei.sh */30 10-11 * * 1-5 root /home/mvp/osyunwei.sh 30 13 * * 1-5 root /home/mvp/osyunwei.sh 0,30 14-15 * * 1-5 root /home/mvp/osyunwei.sh 2八、天天23:50執行 50 23 * * * root /home/mvp/osyunwei.sh 2九、天天10:00、16:00執行 0 10,16 * * * root /home/mvp/osyunwei.sh 30、天天5:30執行 30 5 * * * root /home/mvp/osyunwei.sh 3一、每週一到週五9:30執行 30 9 * * 1-5 root /home/mvp/osyunwei.sh 3二、每週一到週五13:00執行 0 13 * * 1-5 root /home/mvp/osyunwei.sh 3三、天天7:51執行 51 7 * * * root /home/mvp/osyunwei.sh 3四、天天7:5三、12:40分別執行一次 53 7 * * * root /home/mvp/osyunwei.sh 40 12 * * * root /home/mvp/osyunwei.sh 3五、天天7:55執行 55 7 * * * root /home/mvp/osyunwei.sh 3六、天天8:十、16:00、20:00分別執行一次 10 8 * * * root /home/mvp/osyunwei.sh 0 16 * * * root /home/mvp/osyunwei.sh 0 20 * * * root /home/mvp/osyunwei.sh 3七、天天7:5七、8:00分別執行一次 57 7 * * * root /home/mvp/osyunwei.sh 0 8 * * * root /home/mvp/osyunwei.sh
1. 注意環境變量問題
有時咱們建立了一個crontab,可是這個任務卻沒法自動執行,而手動執行這個任務卻沒有問題,這種狀況通常是因爲在crontab文件中沒有配置環境變量引發的。
在 crontab文件中定義多個調度任務時,須要特別注意的一個問題就是環境變量的設置,由於咱們手動執行某個任務時,是在當前shell環境下進行的,程 序固然能找到環境變量,而系統自動執行任務調度時,是不會加載任何環境變量的,所以,就須要在crontab文件中指定任務運行所需的全部環境變量,這 樣,系統執行任務調度時就沒有問題了。
不要假定cron知道所須要的特殊環境,它其實並不知道。因此你要保證在shelll腳本中提供全部必要的路徑和環境變量,除了一些自動設置的全局變量。因此注意以下3點:
1)腳本中涉及文件路徑時寫全局路徑;
2)腳本執行要用到java或其餘環境變量時,經過source命令引入環境變量,如:
cat start_jboss.sh #!/bin/sh source /etc/profile export RUN_CONF=/home/redhat/conf/platform/cbp/cbp_jboss.conf /usr/local/jboss-7.0.5/bin/run.sh -c mev &
3)當手動執行腳本OK,可是crontab死活不執行時。這時必須大膽懷疑是環境變量惹的禍,並能夠嘗試在crontab中直接引入環境變量解決問題。如:
0 * * * * . /etc/profile;/bin/sh /var/www/java/test/bin/restart_audit_test.sh
注意清理系統用戶的日誌.每條任務調度執行完畢,這樣日積月累,日誌信息會很是大,可能會影響系統的正常運行,所以,將每條任務進行重定向處理很是重要。
例如,能夠在crontab文件中設置以下形式,忽略日誌輸出:
0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1
「/dev/null 2>&1」表示先將標準輸出重定向到/dev/null,而後將標準錯誤重定向到標準輸出,因爲標準輸出已經重定向到了/dev/null,所以標準錯誤也會重定向到/dev/null,這樣日誌輸出問題就解決了。
2. 系統級任務調度與用戶級任務調度
系統級任務調度主要完成系統的一些維護操做,用戶級任務調度主要完成用戶自定義的一些任務,能夠將用戶級任務調度放到系統級任務調度來完成(不建議這麼作),可是反過來卻不行,root用戶的任務調度操做能夠經過「crontab –uroot –e」來設置,也能夠將調度任務直接寫入/etc /crontab文件,須要注意的是,若是要定義一個定時重啓系統的任務,就必須將任務放到/etc/crontab文件,即便在root用戶下建立一個 定時重啓系統的任務也是無效的。
3. 其餘注意事項
新建立的cron job,不會立刻執行,至少要過2分鐘才執行。若是重啓cron則立刻執行。當crontab忽然失效時,能夠嘗試/etc/init.d/crond restart解決問題。或者查看日誌看某個job有沒有執行/報錯tail -f /var/log/cron。
千萬別亂運行crontab -r。它從Crontab目錄(/var/spool/cron)中刪除用戶的Crontab文件。 刪除了該用戶的全部crontab都沒了。
在crontab中%是有特殊含義的,表示換行的意思。若是要用的話必須進行轉義\%,如常常用的date ‘+%Y%m%d’在crontab裏是不會執行的,應該換成date ‘+\%Y\%m\%d’。
crontab -l 列出當前登陸用戶全部定時任務 crontab -l -u XXX 列出XXX用戶的全部定時任務,若有沒有會提示 no crontab for XXX crontab -e 編輯當前用戶的定時任務 crontab -r 刪除當前用戶的定時任務 查看crontab的執行狀況: tail -f /var/log/cron 查看crontab的執行log:vim /var/spool/mail/root
每日生成一個以時間命名的log文件 #!/bin/bash echo "Spring Cloud - 收付 - 清空日誌" var=`date +%Y-%m-%d` cd /home/redhat/SpringBoot/ zip -r nohup.out.$var.zip nohup.out cp /dev/null nohup.out
4. 定時任務的時間設置
* * * * * 每分鐘執行 */1 * * * * 每分鐘執行 0 5 * * * 天天五點執行 0-59/2 * * * * 每隔兩分鐘執行,且是偶數分鐘執行,好比2,4,6 1-58/2 * * * * 每隔兩分鐘執行,且是奇數分鐘執行,好比3,5,7 0 0 1,5,10 * * 每月1號,5號,10號執行 0 0 1-5 * * 每月 1到5號執行 minute: 表示分鐘,能夠是從0到59之間的任何整數。 hour:表示小時,能夠是從0到23之間的任何整數。 day:表示日期,能夠是從1到31之間的任何整數。 month:表示月份,能夠是從1到12之間的任何整數。 week:表示星期幾,能夠是從0到7之間的任何整數,這裏的0或7表明星期日。 command:要執行的命令,能夠是系統命令,也能夠是本身編寫的腳本文件。
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表示星期1、以此類推) 第六列 要運行的命令
6. 能夠在線查看crontab手冊
$man crontab | more
首先得肯定,腳本寫的是否正確,shell腳本是否擁有執行權限。一切正常還不能執行的話,就用如下方法:
# 使root用戶的crontab生效 crontab -u root /var/spool/cron/root # 重啓crontab服務 service crond restart
錯誤示例一:
"cronfile1":2: premature EOF errors in crontab file, can"t install. 在crontab文件末尾增長一個空行就可解決此問題。
錯誤示例二:
"/tmp/crontab.NINM91":2: bad day-of-week errors in crontab file,can"t install 根據提示,是第二行的 周寫錯了 crontab -e保存時,crond會檢測時間格式,若是時間格式不正確就會報錯errors in crontab file,can’t install,仍是一個很人性化的設置。