shell之定時(shí)周期性執(zhí)行腳本的方法示例
示例
1.編寫測試腳本腳本 time .sh
$ cat time.sh #! /bin/bash echo $(date +%s) >> /home/ocean/out.txt
保存完畢后記得給予權(quán)限 chmod 777 test.sh
2.添加定時(shí)任務(wù)
$ 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
內(nèi)容編輯為:每一分鐘執(zhí)行一次
# m h dom mon dow command * * * * * /home/ocean/workspaces/shell/time.sh
3.查看定時(shí)任務(wù)是否添加成功
$ crontab -l
4.重啟cron:新加入的定時(shí)任務(wù)不會(huì)馬上執(zhí)行,一般要等一會(huì)兒,除非你重啟服務(wù)器
$ sudo service cron restart
注意,新創(chuàng)建的cron作業(yè),不會(huì)馬上執(zhí)行,至少要過2分鐘才執(zhí)行。如果重啟cron服務(wù)則會(huì)馬上執(zhí)行。
5. 查看執(zhí)行結(jié)果
$ cat out.txt
1552543807
1552543861
1552543921
1552543981
1552544041
1552544101
原理
ubuntu默認(rèn)安裝了cron,是開機(jī)自啟動(dòng)的。
當(dāng)cron啟動(dòng)后,它會(huì)讀取它的所有配置文件,然后cron會(huì)根據(jù)命令和執(zhí)行時(shí)間來調(diào)度工作任務(wù)。
cron有兩個(gè)配置文件,一個(gè)是一個(gè)全局配置文件(/etc/crontab),是針對系統(tǒng)任務(wù)的;一組是crontab命令生成的配置文件(/var/spool/cron下的文件),是針對某個(gè)用戶的.定時(shí)任務(wù)配置到任意一個(gè)中都可以。
每個(gè)用戶的計(jì)劃任務(wù)配置文件
$ ls -l /var/spool/cron/ total 4 drwx-wx--T 2 root crontab 4096 Nov 16 2017 crontabs
備注:這個(gè)歌目錄下只會(huì)有一個(gè)crontabs,就算新添加其他計(jì)劃,也只會(huì)有一個(gè)。
全局性配置文件
$ 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 通過調(diào)用 run-parts 命令,定時(shí)運(yùn)行四個(gè)目錄下的所有腳本。
1)/etc/cron.hourly,目錄下的腳本會(huì)每個(gè)小時(shí)讓執(zhí)行一次,在每小時(shí)的17分鐘時(shí)運(yùn)行;
2)/etc/cron.daily,目錄下的腳本會(huì)每天讓執(zhí)行一次,在每天的6點(diǎn)25分時(shí)運(yùn)行;
3)/etc/cron.weekly,目錄下的腳本會(huì)每周讓執(zhí)行一次,在每周第七天的6點(diǎn)47分時(shí)運(yùn)行;
4)/etc/cron.mouthly,目錄下的腳本會(huì)每月讓執(zhí)行一次,在每月1號的6點(diǎn)52分時(shí)運(yùn)行;
當(dāng)然,以上的時(shí)間均是系統(tǒng)默認(rèn)時(shí)間,可以根據(jù)自己的需求進(jìn)行修改。
corn程序會(huì)在后臺(tái)運(yùn)行并且檢查cron時(shí)間表,以獲知已安排執(zhí)行的主頁。
開啟關(guān)閉cron
命令 | 作用 |
---|---|
sudo service cron status | 查看cron狀態(tài) |
sudo /etc/init.d/cron start | 啟動(dòng)cron |
sudo /etc/init.d/cron stop | 關(guān)閉cron |
sudo /etc/init.d/cron restart | 重啟cron |
cron時(shí)間表
為cron時(shí)間表添加條目, 其格式為
min hour dayofmonth month dayofweek command
分布代表分 時(shí) 天 月 星期幾 數(shù)值范圍分別是 0-59: 0-23 :1-31: 1-12: 0-7
記住幾個(gè)特殊符號的含義:
- 星號(*):代表所有可能的值,舉個(gè)例子,在小時(shí)字段中,一個(gè)星號等同于每個(gè)小時(shí);在月份字段中,一個(gè)星號則等同于每月。
- 逗號(,):可以用逗號隔開的值指定一個(gè)列表范圍,例如,“1,2,5,7,8,9”
- 中杠(-):可以用整數(shù)之間的中杠表示一個(gè)整數(shù)范圍,例如“2-6”表示“2,3,4,5,6”
- 正斜線( / ):可以用正斜線指定時(shí)間的間隔頻率,例如“0-23/2”表示每兩小時(shí)執(zhí)行一次。同時(shí)正斜線可以和星號一起使用,例如*/10,如果用在minute字段,表示每十分鐘執(zhí)行一次。
corn時(shí)間表例子:
- * * * * * test .sh 每分鐘執(zhí)行一次 test .sh
- */5 * * * * test .sh 每5分鐘執(zhí)行一次 test .sh
- 0 */2 * * * test .sh > out 每兩小時(shí)執(zhí)行一次test.sh并將結(jié)果存入out中
- 00 00 * * * /home/rich/test.sh 每天的凌晨0:0分執(zhí)行
- 30 21 * * * /home/rich/test.sh 每天的21:30分執(zhí)行
- 15 16 * * 1 command 每周一16:15 運(yùn)行命令
- 00 12 1 * * command 每個(gè)月的1號的中午12:00點(diǎn)執(zhí)行命令
- 00 8* * * if [date +%d -d tomorrow = 01 ] ; then ; command 每個(gè)月的最后一天8點(diǎn)執(zhí)行命令
可以用三字符的文本值(mon、tue、wed、thu、fri、sat、sun)或數(shù)值(0為周日,6為周六)
來指定dayofweek表項(xiàng)。
cron目錄
如果腳本對精確的執(zhí)行時(shí)間要求不高,用預(yù)配置的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
比如,如果腳本每天運(yùn)行一次,只要將腳本復(fù)制到daily目錄,cron就會(huì)每天執(zhí)行它【根據(jù)/etc/crontab下配置的時(shí)間】
anacron
缺點(diǎn):cron可以執(zhí)行一些定時(shí)任務(wù),但是如果這個(gè)時(shí)間點(diǎn)來了,但是此時(shí)linux系統(tǒng)正在關(guān)機(jī)中,那么這個(gè)定時(shí)任務(wù)不能執(zhí)行。即使系統(tǒng)再次開機(jī),cron也不會(huì)去執(zhí)行哪些已經(jīng)錯(cuò)過了的程序。
解決:anacron,開機(jī)時(shí)會(huì)自動(dòng)運(yùn)行關(guān)機(jī)期間的作業(yè)。前提是這個(gè)程序位于cron目錄之下。
應(yīng)用場景:anacron 用于以天為單位的頻率運(yùn)行命令。它的工作與 cron 最大的不同在于,它假設(shè)機(jī)器不會(huì)一直開機(jī)。
anacron 工作原理
anacron 的任務(wù)被列在/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 通過調(diào)用 run-parts 命令,定時(shí)運(yùn)行3個(gè)目錄下的所有腳本。
從上面可以看出,anacron 的運(yùn)行頻率的最小時(shí)間是天。 【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 程序使用自己的時(shí)間表來檢查工作目錄
時(shí)間表格式
period delay identifier command
- period - 這是任務(wù)的頻率,以天來指定,或者是@daily 、@weekly、@monthly 代表每天、每周、每月一次。你也可以使用數(shù)字:1 - 每天、7 - 每周、30- 每月,或者N - 幾天。 anacron程序用此條目來檢查作業(yè)的時(shí)間戳文件
- delay - 這是在執(zhí)行一個(gè)任務(wù)前等待的分鐘數(shù)。
- identifier - 條目是一種特別的非空字符串,如cron-weekly。它用于唯一標(biāo)識日志消息和錯(cuò)誤郵件中的作業(yè)。
- command - 這是要執(zhí)行的命令或 shell 腳本。
anacron 會(huì)檢查任務(wù)是否已經(jīng)在period字段執(zhí)行的時(shí)間被執(zhí)行了,如果沒有,則等待delay字段中指定的分鐘數(shù)后,執(zhí)行command字段中指定的命令。
一旦任務(wù)被執(zhí)行,它會(huì)使用 job-id (時(shí)間戳文件名)字段中指定的名稱將日期記錄在 /var/spool/anacron 目錄中的時(shí)間戳文件中。
cron VS anacron
cron是linux自帶的守護(hù)進(jìn)程,用來重復(fù)運(yùn)行哪些被設(shè)定好了確定的運(yùn)行時(shí)間的任務(wù),如果機(jī)器處于關(guān)機(jī)狀態(tài)并錯(cuò)過了任務(wù)執(zhí)行時(shí)間,這個(gè)任務(wù)就無法執(zhí)行了
crontab(cron table的簡稱)既可以指cron用來定期執(zhí)行特定任務(wù)所需要的列表文件,又可以指用來創(chuàng)建、刪除、查看當(dāng)前用戶(或者指定用戶)的crontab文件的命令。
anacron不是守護(hù)進(jìn)程,可以看做是cron守護(hù)進(jìn)程的某種補(bǔ)充程序,anacron是獨(dú)立的linux程序,被cron守護(hù)進(jìn)程或者其他開機(jī)腳本啟動(dòng)運(yùn)行,可以每天、每周、每個(gè)月周期性地執(zhí)行一項(xiàng)任務(wù)(最小單位為天)。適合于可能經(jīng)常會(huì)關(guān)機(jī)的機(jī)器,當(dāng)機(jī)器重新開機(jī)anacron程序啟動(dòng)之后,anacron會(huì)檢查anacron任務(wù)是否在合適的周期執(zhí)行了,如果未執(zhí)行則在anacron設(shè)定好的延遲時(shí)間之后只執(zhí)行一次任務(wù),而不管任務(wù)錯(cuò)過了幾次周期。舉個(gè)例子,比如你設(shè)定了一個(gè)每周備份文件的任務(wù),但是你的電腦因?yàn)槟阃獬龆燃俣幱陉P(guān)機(jī)狀態(tài)四周,當(dāng)你回到家中開機(jī)后,anacron會(huì)在延遲一定時(shí)間之后只備份一次文件。由于發(fā)行版的不同,cron守護(hù)進(jìn)程如何運(yùn)行anacron會(huì)有所不同。
cron | anacron |
---|---|
它是守護(hù)進(jìn)程 | 它不是守護(hù)進(jìn)程 |
適合服務(wù)器 適合桌面/筆記本電腦 | |
可以讓你以分鐘級運(yùn)行計(jì)劃任務(wù) | 只能讓你以天為基礎(chǔ)來運(yùn)行計(jì)劃任務(wù) |
關(guān)機(jī)時(shí)不會(huì)執(zhí)行計(jì)劃任務(wù) | 如果計(jì)劃任務(wù)到期,機(jī)器是關(guān)機(jī)的,那么它會(huì)在機(jī)器下次開機(jī)后執(zhí)行計(jì)劃任務(wù) |
普通用戶和 root 用戶都可以使用 | 只有 root 用戶可以使用(使用特定的配置啟動(dòng)普通任務(wù)) |
cron 和 anacron 主要的區(qū)別在于 cron 能在那些持續(xù)運(yùn)行的機(jī)器上有效地運(yùn)行,而 anacron 是針對那些會(huì)在一天內(nèi)或者一周內(nèi)會(huì)關(guān)機(jī)的機(jī)器。
參考:
https://blog.csdn.net/qq_32693119/article/details/79816097
https://www.cnblogs.com/daxian2012/articles/2589894.html
https://www.cnblogs.com/zhoul/p/9931664.html
https://www.linuxprobe.com/cron-anacron-work.html
到此這篇關(guān)于shell之定時(shí)周期性執(zhí)行腳本的方法示例的文章就介紹到這了,更多相關(guān)shell 定時(shí)周期性執(zhí)行腳本內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Shell中數(shù)組以及其相關(guān)操作的詳細(xì)實(shí)例
這篇文章主要給大家介紹了關(guān)于Shell中數(shù)組以及其相關(guān)操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04Shell中實(shí)現(xiàn)“多線程”執(zhí)行腳本文件完美解決方案
這篇文章主要介紹了Shell中實(shí)現(xiàn)“多線程”執(zhí)行腳本文件完美解決方案,本文是針對一次調(diào)用執(zhí)行多個(gè)腳本文件并分批執(zhí)行的一個(gè)解決方法的測試和總結(jié),需要的朋友可以參考下2014-12-12shell腳本中使用iconv實(shí)現(xiàn)批量文件轉(zhuǎn)碼的代碼分享
這篇文章主要介紹了shell腳本中使用iconv實(shí)現(xiàn)批量文件轉(zhuǎn)碼的代碼分享,本文提供了2個(gè)實(shí)現(xiàn)代碼和各自使用方法,需要的朋友可以參考下2014-08-08Shell腳本實(shí)現(xiàn)的memcached進(jìn)程監(jiān)控
這篇文章主要介紹了Shell腳本實(shí)現(xiàn)的memcached進(jìn)程監(jiān)控,實(shí)現(xiàn)功能為監(jiān)控memcached進(jìn)程是否存在,不存在則啟動(dòng)memcached并重載nginx,需要的朋友可以參考下2014-07-07分享70個(gè)經(jīng)典的 Shell 腳本面試題與答案
我們?yōu)槟愕拿嬖嚋?zhǔn)備選擇了 70 個(gè)你可能遇到的 shell 腳本面試問題及解答。了解腳本或至少知道基礎(chǔ)知識對系統(tǒng)管理員來說至關(guān)重要,它也有助于你在工作環(huán)境中自動(dòng)完成很多任務(wù)2018-02-02