怎么在shell實現(xiàn)定時周期性執(zhí)行腳本-創(chuàng)新互聯(lián)

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)怎么在shell實現(xiàn)定時周期性執(zhí)行腳本,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

創(chuàng)新互聯(lián)是專業(yè)的貴州網(wǎng)站建設(shè)公司,貴州接單;提供成都做網(wǎng)站、網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行貴州網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!

示例


1.編寫測試腳本腳本 time .sh


$ cat time.sh 
#! /bin/bash
echo $(date +%s) >> /home/ocean/out.txt

保存完畢后記得給予權(quán)限 chmod 777 test.sh


2.添加定時任務(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.查看定時任務(wù)是否添加成功


$ crontab -l

4.重啟cron:新加入的定時任務(wù)不會馬上執(zhí)行,一般要等一會兒,除非你重啟服務(wù)器


$ sudo service cron restart

注意,新創(chuàng)建的cron作業(yè),不會馬上執(zhí)行,至少要過2分鐘才執(zhí)行。如果重啟cron服務(wù)則會馬上執(zhí)行。


5. 查看執(zhí)行結(jié)果


$ cat out.txt
1552543807
1552543861
1552543921
1552543981
1552544041
1552544101


原理

ubuntu默認(rèn)安裝了cron,是開機自啟動的。

當(dāng)cron啟動后,它會讀取它的所有配置文件,然后cron會根據(jù)命令和執(zhí)行時間來調(diào)度工作任務(wù)。

cron有兩個配置文件,一個是一個全局配置文件(/etc/crontab),是針對系統(tǒng)任務(wù)的;一組是crontab命令生成的配置文件(/var/spool/cron下的文件),是針對某個用戶的.定時任務(wù)配置到任意一個中都可以。


每個用戶的計劃任務(wù)配置文件


$ 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 通過調(diào)用 run-parts 命令,定時運行四個目錄下的所有腳本。
1)/etc/cron.hourly,目錄下的腳本會每個小時讓執(zhí)行一次,在每小時的17分鐘時運行;
2)/etc/cron.daily,目錄下的腳本會每天讓執(zhí)行一次,在每天的6點25分時運行;
3)/etc/cron.weekly,目錄下的腳本會每周讓執(zhí)行一次,在每周第七天的6點47分時運行;
4)/etc/cron.mouthly,目錄下的腳本會每月讓執(zhí)行一次,在每月1號的6點52分時運行;
 當(dāng)然,以上的時間均是系統(tǒng)默認(rèn)時間,可以根據(jù)自己的需求進(jìn)行修改。

corn程序會在后臺運行并且檢查cron時間表,以獲知已安排執(zhí)行的主頁。

開啟關(guān)閉cron

命令作用
sudo service cron status查看cron狀態(tài)
sudo /etc/init.d/cron start啟動cron
sudo /etc/init.d/cron stop關(guān)閉cron
sudo /etc/init.d/cron restart重啟cron

cron時間表


為cron時間表添加條目, 其格式為

min hour dayofmonth month dayofweek command

分布代表分 時 天 月 星期幾 數(shù)值范圍分別是 0-59: 0-23 :1-31: 1-12: 0-7

記住幾個特殊符號的含義:

  •  星號(*):代表所有可能的值,舉個例子,在小時字段中,一個星號等同于每個小時;在月份字段中,一個星號則等同于每月。

  •  逗號(,):可以用逗號隔開的值指定一個列表范圍,例如,“1,2,5,7,8,9”

  •  中杠(-):可以用整數(shù)之間的中杠表示一個整數(shù)范圍,例如“2-6”表示“2,3,4,5,6”

  •  正斜線( / ):可以用正斜線指定時間的間隔頻率,例如“0-23/2”表示每兩小時執(zhí)行一次。同時正斜線可以和星號一起使用,例如*/10,如果用在minute字段,表示每十分鐘執(zhí)行一次。

corn時間表例子:

  •  * * * * * test .sh 每分鐘執(zhí)行一次 test .sh

  •  */5 * * * * test .sh 每5分鐘執(zhí)行一次 test .sh

  •  0 */2 * * * test .sh > out 每兩小時執(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 運行命令

  •  00 12 1 * * command 每個月的1號的中午12:00點執(zhí)行命令

  •  00 8* * * if [date +%d -d tomorrow = 01 ] ; then ; command 每個月的最后一天8點執(zhí)行命令

可以用三字符的文本值(mon、tue、wed、thu、fri、sat、sun)或數(shù)值(0為周日,6為周六)
 來指定dayofweek表項。

cron目錄

如果腳本對精確的執(zhí)行時間要求不高,用預(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

比如,如果腳本每天運行一次,只要將腳本復(fù)制到daily目錄,cron就會每天執(zhí)行它【根據(jù)/etc/crontab下配置的時間】

anacron

缺點:cron可以執(zhí)行一些定時任務(wù),但是如果這個時間點來了,但是此時linux系統(tǒng)正在關(guān)機中,那么這個定時任務(wù)不能執(zhí)行。即使系統(tǒng)再次開機,cron也不會去執(zhí)行哪些已經(jīng)錯過了的程序。


解決:anacron,開機時會自動運行關(guān)機期間的作業(yè)。前提是這個程序位于cron目錄之下。


應(yīng)用場景:anacron 用于以天為單位的頻率運行命令。它的工作與 cron 較大的不同在于,它假設(shè)機器不會一直開機。

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 命令,定時運行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 - 這是任務(wù)的頻率,以天來指定,或者是@daily 、@weekly、@monthly 代表每天、每周、每月一次。你也可以使用數(shù)字:1 - 每天、7 - 每周、30- 每月,或者N - 幾天。 anacron程序用此條目來檢查作業(yè)的時間戳文件

  • delay - 這是在執(zhí)行一個任務(wù)前等待的分鐘數(shù)。

  • identifier - 條目是一種特別的非空字符串,如cron-weekly。它用于標(biāo)識日志消息和錯誤郵件中的作業(yè)。

  • command - 這是要執(zhí)行的命令或 shell 腳本。

anacron 會檢查任務(wù)是否已經(jīng)在period字段執(zhí)行的時間被執(zhí)行了,如果沒有,則等待delay字段中指定的分鐘數(shù)后,執(zhí)行command字段中指定的命令。


一旦任務(wù)被執(zhí)行,它會使用 job-id (時間戳文件名)字段中指定的名稱將日期記錄在 /var/spool/anacron 目錄中的時間戳文件中。

cron VS anacron

cron是linux自帶的守護(hù)進(jìn)程,用來重復(fù)運行哪些被設(shè)定好了確定的運行時間的任務(wù),如果機器處于關(guān)機狀態(tài)并錯過了任務(wù)執(zhí)行時間,這個任務(wù)就無法執(zhí)行了
crontab(cron table的簡稱)既可以指cron用來定期執(zhí)行特定任務(wù)所需要的列表文件,又可以指用來創(chuàng)建、刪除、查看當(dāng)前用戶(或者指定用戶)的crontab文件的命令。
anacron不是守護(hù)進(jìn)程,可以看做是cron守護(hù)進(jìn)程的某種補充程序,anacron是獨立的linux程序,被cron守護(hù)進(jìn)程或者其他開機腳本啟動運行,可以每天、每周、每個月周期性地執(zhí)行一項任務(wù)(最小單位為天)。適合于可能經(jīng)常會關(guān)機的機器,當(dāng)機器重新開機anacron程序啟動之后,anacron會檢查anacron任務(wù)是否在合適的周期執(zhí)行了,如果未執(zhí)行則在anacron設(shè)定好的延遲時間之后只執(zhí)行一次任務(wù),而不管任務(wù)錯過了幾次周期。舉個例子,比如你設(shè)定了一個每周備份文件的任務(wù),但是你的電腦因為你外出度假而處于關(guān)機狀態(tài)四周,當(dāng)你回到家中開機后,anacron會在延遲一定時間之后只備份一次文件。由于發(fā)行版的不同,cron守護(hù)進(jìn)程如何運行anacron會有所不同。

cronanacron
它是守護(hù)進(jìn)程它不是守護(hù)進(jìn)程
適合服務(wù)器 適合桌面/筆記本電腦
可以讓你以分鐘級運行計劃任務(wù)只能讓你以天為基礎(chǔ)來運行計劃任務(wù)
關(guān)機時不會執(zhí)行計劃任務(wù)如果計劃任務(wù)到期,機器是關(guān)機的,那么它會在機器下次開機后執(zhí)行計劃任務(wù)
普通用戶和 root 用戶都可以使用只有 root 用戶可以使用(使用特定的配置啟動普通任務(wù))

上述就是小編為大家分享的怎么在shell實現(xiàn)定時周期性執(zhí)行腳本了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

文章標(biāo)題:怎么在shell實現(xiàn)定時周期性執(zhí)行腳本-創(chuàng)新互聯(lián)
標(biāo)題路徑:http://muchs.cn/article42/dodohc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、移動網(wǎng)站建設(shè)、電子商務(wù)、品牌網(wǎng)站建設(shè)、網(wǎng)站排名、網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司