您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關怎么在shell實現定時周期性執行腳本,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
示例
1.編寫測試腳本腳本 time .sh
$ cat time.sh #! /bin/bash echo $(date +%s) >> /home/ocean/out.txt
保存完畢后記得給予權限 chmod 777 test.sh
2.添加定時任務
$ crontab -e no crontab for ocean - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/nano <---- easiest 2. /usr/bin/vim.tiny 3. /bin/ed
內容編輯為:每一分鐘執行一次
# m h dom mon dow command * * * * * /home/ocean/workspaces/shell/time.sh
3.查看定時任務是否添加成功
$ crontab -l
4.重啟cron:新加入的定時任務不會馬上執行,一般要等一會兒,除非你重啟服務器
$ sudo service cron restart
注意,新創建的cron作業,不會馬上執行,至少要過2分鐘才執行。如果重啟cron服務則會馬上執行。
5. 查看執行結果
$ cat out.txt
1552543807
1552543861
1552543921
1552543981
1552544041
1552544101
原理
ubuntu默認安裝了cron,是開機自啟動的。
當cron啟動后,它會讀取它的所有配置文件,然后cron會根據命令和執行時間來調度工作任務。
cron有兩個配置文件,一個是一個全局配置文件(/etc/crontab),是針對系統任務的;一組是crontab命令生成的配置文件(/var/spool/cron下的文件),是針對某個用戶的.定時任務配置到任意一個中都可以。
每個用戶的計劃任務配置文件
$ ls -l /var/spool/cron/ total 4 drwx-wx--T 2 root crontab 4096 Nov 16 2017 crontabs
備注:這個歌目錄下只會有一個crontabs,就算新添加其他計劃,也只會有一個。
全局性配置文件
$ cat /etc/crontab # /etc/crontab: system-wide crontab # Unlike any other crontab you don't have to run the `crontab' # command to install the new version when you edit this file # and files in /etc/cron.d. These files also have username fields, # that none of the other crontabs do. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # m h dom mon dow user command 17 * * * * root cd / && run-parts --report /etc/cron.hourly 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
ununtu 通過調用 run-parts 命令,定時運行四個目錄下的所有腳本。
1)/etc/cron.hourly,目錄下的腳本會每個小時讓執行一次,在每小時的17分鐘時運行;
2)/etc/cron.daily,目錄下的腳本會每天讓執行一次,在每天的6點25分時運行;
3)/etc/cron.weekly,目錄下的腳本會每周讓執行一次,在每周第七天的6點47分時運行;
4)/etc/cron.mouthly,目錄下的腳本會每月讓執行一次,在每月1號的6點52分時運行;
當然,以上的時間均是系統默認時間,可以根據自己的需求進行修改。
corn程序會在后臺運行并且檢查cron時間表,以獲知已安排執行的主頁。
開啟關閉cron
命令 | 作用 |
---|---|
sudo service cron status | 查看cron狀態 |
sudo /etc/init.d/cron start | 啟動cron |
sudo /etc/init.d/cron stop | 關閉cron |
sudo /etc/init.d/cron restart | 重啟cron |
cron時間表
為cron時間表添加條目, 其格式為
min hour dayofmonth month dayofweek command
分布代表分 時 天 月 星期幾 數值范圍分別是 0-59: 0-23 :1-31: 1-12: 0-7
記住幾個特殊符號的含義:
星號(*):代表所有可能的值,舉個例子,在小時字段中,一個星號等同于每個小時;在月份字段中,一個星號則等同于每月。
逗號(,):可以用逗號隔開的值指定一個列表范圍,例如,“1,2,5,7,8,9”
中杠(-):可以用整數之間的中杠表示一個整數范圍,例如“2-6”表示“2,3,4,5,6”
正斜線( / ):可以用正斜線指定時間的間隔頻率,例如“0-23/2”表示每兩小時執行一次。同時正斜線可以和星號一起使用,例如*/10,如果用在minute字段,表示每十分鐘執行一次。
corn時間表例子:
* * * * * test .sh 每分鐘執行一次 test .sh
*/5 * * * * test .sh 每5分鐘執行一次 test .sh
0 */2 * * * test .sh > out 每兩小時執行一次test.sh并將結果存入out中
00 00 * * * /home/rich/test.sh 每天的凌晨0:0分執行
30 21 * * * /home/rich/test.sh 每天的21:30分執行
15 16 * * 1 command 每周一16:15 運行命令
00 12 1 * * command 每個月的1號的中午12:00點執行命令
00 8* * * if [date +%d -d tomorrow = 01 ] ; then ; command 每個月的最后一天8點執行命令
可以用三字符的文本值(mon、tue、wed、thu、fri、sat、sun)或數值(0為周日,6為周六)
來指定dayofweek表項。
cron目錄
如果腳本對精確的執行時間要求不高,用預配置的cron腳本更方便
$ ls /etc/cron.*ly /etc/cron.daily: 0anacron apt-compat cracklib-runtime logrotate mlocate popularity-contest update-notifier-common apport bsdmainutils dpkg man-db passwd ubuntu-advantage-tools /etc/cron.hourly: /etc/cron.monthly: 0anacron /etc/cron.weekly: 0anacron man-db update-notifier-common
比如,如果腳本每天運行一次,只要將腳本復制到daily目錄,cron就會每天執行它【根據/etc/crontab下配置的時間】
anacron
缺點:cron可以執行一些定時任務,但是如果這個時間點來了,但是此時linux系統正在關機中,那么這個定時任務不能執行。即使系統再次開機,cron也不會去執行哪些已經錯過了的程序。
解決:anacron,開機時會自動運行關機期間的作業。前提是這個程序位于cron目錄之下。
應用場景:anacron 用于以天為單位的頻率運行命令。它的工作與 cron 最大的不同在于,它假設機器不會一直開機。
anacron 工作原理
anacron 的任務被列在/etc/anacrontab
sudo cat /etc/anacrontab [sudo] password for ocean: # /etc/anacrontab: configuration file for anacron # See anacron(8) and anacrontab(5) for details. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin HOME=/root LOGNAME=root # These replace cron's entries 1 5 cron.daily run-parts --report /etc/cron.daily 7 10 cron.weekly run-parts --report /etc/cron.weekly @monthly 15 cron.monthly run-parts --report /etc/cron.monthly
ununtu 通過調用 run-parts 命令,定時運行3個目錄下的所有腳本。
從上面可以看出,anacron 的運行頻率的最小時間是天。 【cron是分鐘】
$ ls -l /var/spool/anacron/ total 12 -rw------- 1 root root 9 Jun 1 10:25 cron.daily -rw------- 1 root root 9 May 27 11:01 cron.monthly -rw------- 1 root root 9 May 30 10:28 cron.weekly
anacron 程序使用自己的時間表來檢查工作目錄
時間表格式
period delay identifier command
period - 這是任務的頻率,以天來指定,或者是@daily 、@weekly、@monthly 代表每天、每周、每月一次。你也可以使用數字:1 - 每天、7 - 每周、30- 每月,或者N - 幾天。 anacron程序用此條目來檢查作業的時間戳文件
delay - 這是在執行一個任務前等待的分鐘數。
identifier - 條目是一種特別的非空字符串,如cron-weekly。它用于唯一標識日志消息和錯誤郵件中的作業。
command - 這是要執行的命令或 shell 腳本。
anacron 會檢查任務是否已經在period字段執行的時間被執行了,如果沒有,則等待delay字段中指定的分鐘數后,執行command字段中指定的命令。
一旦任務被執行,它會使用 job-id (時間戳文件名)字段中指定的名稱將日期記錄在 /var/spool/anacron 目錄中的時間戳文件中。
cron VS anacron
cron是linux自帶的守護進程,用來重復運行哪些被設定好了確定的運行時間的任務,如果機器處于關機狀態并錯過了任務執行時間,這個任務就無法執行了
crontab(cron table的簡稱)既可以指cron用來定期執行特定任務所需要的列表文件,又可以指用來創建、刪除、查看當前用戶(或者指定用戶)的crontab文件的命令。
anacron不是守護進程,可以看做是cron守護進程的某種補充程序,anacron是獨立的linux程序,被cron守護進程或者其他開機腳本啟動運行,可以每天、每周、每個月周期性地執行一項任務(最小單位為天)。適合于可能經常會關機的機器,當機器重新開機anacron程序啟動之后,anacron會檢查anacron任務是否在合適的周期執行了,如果未執行則在anacron設定好的延遲時間之后只執行一次任務,而不管任務錯過了幾次周期。舉個例子,比如你設定了一個每周備份文件的任務,但是你的電腦因為你外出度假而處于關機狀態四周,當你回到家中開機后,anacron會在延遲一定時間之后只備份一次文件。由于發行版的不同,cron守護進程如何運行anacron會有所不同。
cron | anacron |
---|---|
它是守護進程 | 它不是守護進程 |
適合服務器 適合桌面/筆記本電腦 | |
可以讓你以分鐘級運行計劃任務 | 只能讓你以天為基礎來運行計劃任務 |
關機時不會執行計劃任務 | 如果計劃任務到期,機器是關機的,那么它會在機器下次開機后執行計劃任務 |
普通用戶和 root 用戶都可以使用 | 只有 root 用戶可以使用(使用特定的配置啟動普通任務) |
上述就是小編為大家分享的怎么在shell實現定時周期性執行腳本了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。