在linux上定期執(zhí)行命令、腳本(cron,crontab,anacron)
人類把時間做了切割,想象一條筆直的線永遠(yuǎn)向前,本來這條直線上什么都沒有,但是人類根據(jù)時間的長短(單位)在這條直線上做了密密麻麻的標(biāo)記(世紀(jì)-年-月-日-時-分-秒-納秒......),通過這樣的方式歷史上的每一個時刻都能夠被單獨拿出來,而未來的每一個時刻也能被單獨計劃。更重要的是,每一個單獨的時刻又能跟相鄰的被更大單位所控制的相似時刻做比較,比如,今天的晚上12點跟明天的晚上12點,相似的是,兩個時刻都是12點,不同的是今天跟明天,她們是相鄰的更大單位。因為這樣的緣故,在被更大單位所隔開的每一個相同時刻,我們可以告訴計算機(jī)重復(fù)某個任務(wù)。
在linux下,如果想要在未來的某個時刻執(zhí)行某個任務(wù),并且在未來的每一個這樣的時刻里都要執(zhí)行這個任務(wù),舉個簡單的例子,比如說想要在將來,每天的十二點都重啟路由器,大多數(shù)發(fā)行版都自帶一個守護(hù)進(jìn)程(daemon)cron來完成這項工作。
1.cron,crontab以及anacron的關(guān)系
cron是大多數(shù)linux發(fā)行版都自帶的守護(hù)進(jìn)程(daemon),用來重復(fù)運行某些被設(shè)定好了確定的運行時間的任務(wù),這些任務(wù)可以是每個月運行、每周運行、每天運行,甚至是每一分鐘運行。用cron執(zhí)行的任務(wù)適合于24小時運行的機(jī)器,cron執(zhí)行的任務(wù)會在設(shè)定好的時刻執(zhí)行,當(dāng)機(jī)器處于關(guān)機(jī)狀態(tài)下并錯過了任務(wù)執(zhí)行的時間,cron任務(wù)就無法預(yù)期執(zhí)行了。
crontab(cron table的簡稱)既可以指cron用來定期執(zhí)行特定任務(wù)所需要的列表文件,又可以指用來創(chuàng)建、刪除、查看當(dāng)前用戶(或者指定用戶)的crontab文件的命令。
anacron不是守護(hù)進(jìn)程,可以看做是cron守護(hù)進(jìn)程的某種補(bǔ)充程序,anacron是獨立的linux程序,被cron守護(hù)進(jìn)程或者其他開機(jī)腳本啟動運行,可以每天、每周、每個月周期性地執(zhí)行一項任務(wù)(最小單位為天)。適合于可能經(jīng)常會關(guān)機(jī)的機(jī)器,當(dāng)機(jī)器重新開機(jī)anacron程序啟動之后,anacron會檢查anacron任務(wù)是否在合適的周期執(zhí)行了,如果未執(zhí)行則在anacron設(shè)定好的延遲時間之后只執(zhí)行一次任務(wù),而不管任務(wù)錯過了幾次周期。舉個例子,比如你設(shè)定了一個每周備份文件的任務(wù),但是你的電腦因為你外出度假而處于關(guān)機(jī)狀態(tài)四周,當(dāng)你回到家中開機(jī)后,anacron會在延遲一定時間之后只備份一次文件。由于發(fā)行版的不同,cron守護(hù)進(jìn)程如何運行anacron會有所不同。
2.crontab命令,crontab文件語法
系統(tǒng)默認(rèn)crontab文件為/etc/crontab,以及/etc/cron.d/目錄下的文件,有些程序會把自己的crontab文件放在/etc/cron.d/目錄下。要修改/etc/crontab以及/etc/cron.d/目錄下的文件需要root權(quán)限。cron守護(hù)進(jìn)程會檢查/etc/crontab以及/etc/cron.d/目錄下的文件,根據(jù)這些文件中的cron任務(wù)所設(shè)置的執(zhí)行時間決定是否執(zhí)行任務(wù),如果當(dāng)前時間與cron任務(wù)所設(shè)置的執(zhí)行時間相同,則執(zhí)行任務(wù)。
每個用戶自己的crontab文件都會被放在 /var/spool/cron目錄下,默認(rèn)為空,可以使用crontab命令創(chuàng)建。cron守護(hù)進(jìn)程會檢查/var/spool/cron目錄下的文件,根據(jù)這些文件中的cron任務(wù)所設(shè)置的執(zhí)行時間決定是否執(zhí)行任務(wù),如果當(dāng)前時間與cron任務(wù)所設(shè)置的執(zhí)行時間相同,則執(zhí)行任務(wù)。
當(dāng)cron的配置文件發(fā)生改變時,不需要重置cron守護(hù)進(jìn)程。cron守護(hù)進(jìn)程會檢查配置文件的變化。
創(chuàng)建自己的crontab之前,首先要設(shè)置環(huán)境變量EDITOR,cron進(jìn)程根據(jù)它來確定使用哪個編輯器編輯crontab文件。在home目錄下的.bashrc或者.profile里加入一行
#你也可以使用自己喜愛的其他終端編輯器 EDITOR=vim; export EDITOR
2.1.crontab命令參數(shù)及使用示例
usage: crontab [-u user] file
crontab [ -u user ] [ -i ] { -e | -l | -r }
-e (edit user's crontab)
-l (list user's crontab)
-r (delete user's crontab)
-i (prompt before deleting user's crontab)
創(chuàng)建并編輯當(dāng)前用戶的crontab
crontab -e
列出當(dāng)前用戶的crontab
crontab -l
刪除用戶linus的crontab
crontab -u linus -i -r
2.2.crontab文件語法詳解及示例
當(dāng)用 crontab -e 編輯當(dāng)前用戶的crontab文件時,首先寫入以下內(nèi)容。
# crontab -e SHELL=/bin/bash MAILTO=root@example.com PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed
該文件的前三行代碼設(shè)置了默認(rèn)環(huán)境。cron守護(hù)進(jìn)程并不提供任何環(huán)境。SHELL變量設(shè)置當(dāng)cron任務(wù)(命令以及腳本)運行時的shell,MAILTO變量設(shè)置cron任務(wù)執(zhí)行結(jié)果發(fā)送的郵箱,PATH設(shè)置去哪些目錄下尋找cron任務(wù)的命令。注釋部分則解釋一條cron任務(wù)的構(gòu)成,一條cron任務(wù)就是一行,要設(shè)置多少條cron任務(wù)則寫多少行。一條cron任務(wù)由七個部分組成,從左到右依次為:
- 分鐘(0-59)
- 小時(0-23)
- 天(1-31)
- 月 (1-12):或者可以使用月份的英文單詞的前三個字母,比如jan,feb,mar,apr...
- 星期(0-6):星期天用0或者7都可以,或者可以使用星期的英文單詞的前三個字母,比如sun,mon,tue,wed,thu,fri,sat
- 用戶名稱(可以省略)
- 要執(zhí)行的命令或者腳本目錄
前五個部分的編寫注意特殊符號的含義:
- 如果你想匹配取值范圍內(nèi)的所有值,使用“*”
- 想匹配某些特殊的值,使用“,”,比如2,4,7就匹配的是2,4以及7。
- 兩個值被“-”連接表示范圍,此時匹配的是范圍內(nèi)所有值,包含“-”兩邊的值,比如4-7匹配的就是從4到7。
- 想要表達(dá)每隔一段時間執(zhí)行一次任務(wù),使用 “/”, 比如分鐘部分中的 “*/10”表示每10分鐘運行一次,比如小時部分中的“10-22/2”則表示在早上10點到晚上10點這段時間內(nèi),每隔兩個小時運行一次。 注意 :當(dāng)“/”左邊的值可以除盡“/”右邊的值時,任務(wù)才會運行。
例子1:
每天凌晨執(zhí)行
0 0 * * * root command
例子2:
每周星期天早上五點執(zhí)行
0 5 * * sun root command
例子3:
每個月的前10天晚上10點開始每隔10分鐘執(zhí)行一次命令
*/10 22 1-10 * * root command
例子4:
從星期一到五,每個小時的第10分鐘、第20分鐘以及第30分鐘都執(zhí)行一次命令
10,20,30 * * * 1-5 root command
例子5:
從早上10點到晚上10點,每個偶數(shù)的小時(比如10點,12點)里每五分鐘運行一次命令
*/5 10-22/2 * * * root command
特殊簡便寫法:
@hourly 代表 0 * * * * ,每個小時運行一次
@daily 代表 0 0 * * * ,每天凌晨運行一次
@weekly 代表 0 0 * * 0 ,每周星期天凌晨運行一次
@monthly 代表 0 0 1 * * ,每個月第一天凌晨運行一次
@yearly 代表 0 0 1 1 * ,每年的頭一分鐘運行一次
@reboot 重啟后執(zhí)行一次
例子:
每天凌晨運行一次
@daily command
你可以把需要每個小時運行一次的腳本放到/etc/cron.hourly目錄下,cron守護(hù)進(jìn)程會每個小時都運行一次。
2.3.限制可以使用cron的用戶
在/etc/目錄下,可能默認(rèn)會有cron.allow以及cron.deny文件,也可能沒有,沒有的情況下可以自己創(chuàng)建,cron.allow文件包含了可以使用cron的用戶名,cron.deny文件包含了不可以使用cron的用戶名。兩個文件中每個用戶名占一行,并且不允許出現(xiàn)空格。
root用戶在任何情況下都可以使用cron。
假如cron.allow存在,則只有列在這個文件中的用戶名可以使用cron,這時候cron.deny被忽視。
假如cron.allow不存在,則列在cron.deny文件中的用戶名不可以使用cron。
3.用anacron執(zhí)行周期性的任務(wù)
anacron程序可以周期性的執(zhí)行任務(wù),但具體執(zhí)行時間并不確定??梢悦刻臁⒚恐?、每個月周期性的執(zhí)行任務(wù)。當(dāng)anacron的配置文件發(fā)生改變時,下一次anacron運行時會檢查到配置文件的變化。anacron的配置文件為/etc/anacrontab,編輯需要root權(quán)限,默認(rèn)以下內(nèi)容:
# See anacron(8) and anacrontab(5) for details. SHELL=/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # the maximal random delay added to the base delay of the jobs RANDOM_DELAY=45 # the jobs will be started during the following hours only START_HOURS_RANGE=3-22 #period in days delay in minutes job-identifier command 1 5 cron.daily nice run-parts /etc/cron.daily 7 25 cron.weekly nice run-parts /etc/cron.weekly @monthly 45 cron.monthly nice run-parts /etc/cron.monthly
可以看到前三行設(shè)置了默認(rèn)環(huán)境,RANDOM_DELAY變量設(shè)置了最大延遲執(zhí)行時間,START_HOURS_RANGE變量設(shè)置了anacron任務(wù)執(zhí)行的時間范圍,默認(rèn)在每天的3點到22點之間。最后三行則設(shè)置了三條默認(rèn)的anacron任務(wù),分別是每天執(zhí)行,每周執(zhí)行,每月執(zhí)行。
3.1.anacron文件語法
觀察前面三條默認(rèn)的anacron任務(wù),可以看到一條anacron任務(wù)分為四個部分,從左到右依次為:
- 周期(天):設(shè)置任務(wù)執(zhí)行的頻率,以 天數(shù) 為單位,寫1則代表每天執(zhí)行,寫3則代表每3天執(zhí)行,可以使用特殊符號“@”, @daily 代表每天, @weekly 代表每周, @monthly 代表每月。
- 延遲時間:設(shè)置任務(wù)的延遲時間,以 分鐘 為單位,比如寫5,則當(dāng)anacron啟動后,anacron等待5分鐘就會執(zhí)行該任務(wù)。設(shè)置延遲時間是為了當(dāng)機(jī)器啟動時不會因為執(zhí)行很多anacron任務(wù)而過載。
- 任務(wù)標(biāo)識:其目的是識別消息,日志文件和執(zhí)行特殊操作。
- 要執(zhí)行的命令
在/etc/anacrontab中的三條默認(rèn)anacron任務(wù)中,nice命令用來調(diào)整后面命令的優(yōu)先級,run-parts命令用來執(zhí)行設(shè)置的目錄下的所有腳本,就是說這三條任務(wù)分別每天,每周,每月執(zhí)行/etc/cron.daily,/etc/cron.weekly,/etc/cron.monthly目錄下的腳本。所以我們不用自己往/etc/anacrontab中添加anacrontab任務(wù),而只需把腳本放到相應(yīng)的目錄下,anacron就會周期性的執(zhí)行這些腳本了。
3.2.anacron如何運行
既然anacron不是守護(hù)進(jìn)程,那它是如何做到周期性執(zhí)行任務(wù)的呢?在centos7下,cron會運行/etc/cron.d/0hourly,在/etc/cron.d/0hourly文件里,有一條cron任務(wù)是這樣的:
01 * * * * root run-parts /etc/cron.hourly
這條cron任務(wù)會運行/etc/cron.hourly目錄下的所有腳本,其中有一個名為 0anacron 的腳本,該腳本則會在合適的時間運行anacron,anacron則會檢查/etc/anacrontab,在合適的時間分別運行/etc/cron.daily,/etc/cron.weekly,/etc/cron.monthly目錄下的腳本。
參考資料:
How to Schedule Job on Linux using Cron, Anacron and at Commands
總結(jié)
以上所述是小編給大家介紹的在linux上定期執(zhí)行命令、腳本(cron,crontab,anacron),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
linux修改tomcat默認(rèn)訪問項目的具體步驟(必看篇)
下面小編就為大家?guī)硪黄猯inux修改tomcat默認(rèn)訪問項目的具體步驟(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03
檢查linux網(wǎng)絡(luò)狀態(tài)的兩個腳本
檢查linux網(wǎng)絡(luò)狀態(tài)的兩個腳本,包括通過定時收發(fā)email檢測網(wǎng)絡(luò)連通性、定時檢測網(wǎng)絡(luò)狀態(tài)通過email發(fā)送,有需要的朋友可以參考下2013-02-02
Shell腳本中實現(xiàn)把輸入的密碼轉(zhuǎn)換為*(星號)的方法
這篇文章主要介紹了Shell腳本中實現(xiàn)把輸入的密碼轉(zhuǎn)換為*(星號)的方法,從而把密碼字符串隱藏起來,比較實用的一個功能,在做交互設(shè)計時非常有用哦,需要的朋友可以參考下2014-06-06

