在linux上按期執行命令、腳本(cron,crontab,anacron)

人類把時間作了切割,想象一條筆直的線永遠向前,原本這條直線上什麼都沒有,可是人類根據時間的長短(單位)在這條直線上作了密密麻麻的標記(世紀-年-月-日-時-分-秒-豪秒......),經過這樣的方式歷史上的每個時刻都可以被單獨拿出來,而將來的每個時刻也能被單獨計劃。更重要的是,每個單獨的時刻又能跟相鄰的被更大單位所控制的類似時刻作比較,好比,今天的晚上12點跟明天的晚上12點,類似的是,兩個時刻都是12點,不一樣的是今天跟明天,她們是相鄰的更大單位。由於這樣的緣故,在被更大單位所隔開的每個相同時刻,咱們能夠告訴計算機重複某個任務。linux

在linux下,若是想要在將來的某個時刻執行某個任務,而且在將來的每個這樣的時刻裏都要執行這個任務,舉個簡單的例子,好比說想要在未來,天天的十二點都重啓路由器,大多數發行版都自帶一個守護進程(daemon)cron來完成這項工做。git

1.cron,crontab以及anacron的關係

cron是大多數linux發行版都自帶的守護進程(daemon),用來重複運行某些被設定好了肯定的運行時間的任務,這些任務能夠是每月運行、每週運行、天天運行,甚至是每一分鐘運行。用cron執行的任務適合於24小時運行的機器,cron執行的任務會在設定好的時刻執行,當機器處於關機狀態下並錯過了任務執行的時間,cron任務就沒法預期執行了。github

crontab(cron table的簡稱)既能夠指cron用來按期執行特定任務所須要的列表文件,又能夠指用來建立、刪除、查看當前用戶(或者指定用戶)的crontab文件的命令。shell

anacron不是守護進程,能夠看作是cron守護進程的某種補充程序,anacron是獨立的linux程序,被cron守護進程或者其餘開機腳本啓動運行,能夠天天、每週、每月週期性地執行一項任務(最小單位爲天)。適合於可能常常會關機的機器,當機器從新開機anacron程序啓動以後,anacron會檢查anacron任務是否在合適的週期執行了,若是未執行則在anacron設定好的延遲時間以後只執行一次任務,而無論任務錯過了幾回週期。舉個例子,好比你設定了一個每週備份文件的任務,可是你的電腦由於你外出度假而處於關機狀態四周,當你回到家中開機後,anacron會在延遲必定時間以後只備份一次文件。因爲發行版的不一樣,cron守護進程如何運行anacron會有所不一樣。vim

2.crontab命令,crontab文件語法

系統默認crontab文件爲/etc/crontab,以及/etc/cron.d/目錄下的文件,有些程序會把本身的crontab文件放在/etc/cron.d/目錄下。要修改/etc/crontab以及/etc/cron.d/目錄下的文件須要root權限。cron守護進程會檢查/etc/crontab以及/etc/cron.d/目錄下的文件,根據這些文件中的cron任務所設置的執行時間決定是否執行任務,若是當前時間與cron任務所設置的執行時間相同,則執行任務。centos

每一個用戶本身的crontab文件都會被放在 /var/spool/cron目錄下,默認爲空,可使用crontab命令建立。cron守護進程會檢查/var/spool/cron目錄下的文件,根據這些文件中的cron任務所設置的執行時間決定是否執行任務,若是當前時間與cron任務所設置的執行時間相同,則執行任務。bash

當cron的配置文件發生改變時,不須要重置cron守護進程。cron守護進程會檢查配置文件的變化。dom

建立本身的crontab以前,首先要設置環境變量EDITOR,cron進程根據它來肯定使用哪一個編輯器編輯crontab文件。在home目錄下的.bashrc或者.profile里加入一行編輯器

#你也可使用本身喜好的其餘終端編輯器
EDITOR=vim; export EDITOR

複製代碼

2.1.crontab命令參數及使用示例

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)
複製代碼

建立並編輯當前用戶的crontabide

crontab -e
複製代碼

列出當前用戶的crontab

crontab -l
複製代碼

刪除用戶linus的crontab

crontab -u linus -i -r
複製代碼

2.2.crontab文件語法詳解及示例

當用crontab -e編輯當前用戶的crontab文件時,首先寫入如下內容。

# 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

複製代碼

該文件的前三行代碼設置了默認環境。cron守護進程並不提供任何環境。SHELL變量設置當cron任務(命令以及腳本)運行時的shell,MAILTO變量設置cron任務執行結果發送的郵箱,PATH設置去哪些目錄下尋找cron任務的命令。註釋部分則解釋一條cron任務的構成,一條cron任務就是一行,要設置多少條cron任務則寫多少行。一條cron任務由七個部分組成,從左到右依次爲:

  • 分鐘(0-59)
  • 小時(0-23)
  • 天(1-31)
  • 月 (1-12):或者可使用月份的英文單詞的前三個字母,好比jan,feb,mar,apr...
  • 星期(0-6):星期天用0或者7均可以,或者可使用星期的英文單詞的前三個字母,好比sun,mon,tue,wed,thu,fri,sat
  • 用戶名稱(能夠省略)
  • 要執行的命令或者腳本目錄

前五個部分的編寫注意特殊符號的含義:

  • 若是你想匹配取值範圍內的全部值,使用「*」
  • 想匹配某些特殊的值,使用「,」,好比2,4,7就匹配的是2,4以及7。
  • 兩個值被「-」鏈接表示範圍,此時匹配的是範圍內全部值,包含「-」兩邊的值,好比4-7匹配的就是從4到7。
  • 想要表達每隔一段時間執行一次任務,使用 「/」, 好比分鐘部分中的 「*/10」表示每10分鐘運行一次,好比小時部分中的「10-22/2」則表示在早上10點到晚上10點這段時間內,每隔兩個小時運行一次。 注意:當「/」左邊的值能夠除盡「/」右邊的值時,任務纔會運行。

例子1: 天天凌晨執行

0 0 * * * root command
複製代碼

例子2: 每週星期天早上五點執行

0 5 * * sun root command
複製代碼

例子3: 每月的前10天晚上10點開始每隔10分鐘執行一次命令

*/10 22 1-10 * * root command
複製代碼

例子4: 從星期一到五,每一個小時的第10分鐘、第20分鐘以及第30分鐘都執行一次命令

10,20,30 * * * 1-5 root command
複製代碼

例子5: 從早上10點到晚上10點,每一個偶數的小時(好比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 重啓後執行一次

例子: 天天凌晨運行一次 @daily command 你能夠把須要每一個小時運行一次的腳本放到/etc/cron.hourly目錄下,cron守護進程會每一個小時都運行一次。

2.3.限制可使用cron的用戶

在/etc/目錄下,可能默認會有cron.allow以及cron.deny文件,也可能沒有,沒有的狀況下能夠本身建立,cron.allow文件包含了可使用cron的用戶名,cron.deny文件包含了不可使用cron的用戶名。兩個文件中每一個用戶名佔一行,而且不容許出現空格。 root用戶在任何狀況下均可以使用cron。 假如cron.allow存在,則只有列在這個文件中的用戶名可使用cron,這時候cron.deny被忽視。 假如cron.allow不存在,則列在cron.deny文件中的用戶名不可使用cron。

3.用anacron執行週期性的任務

anacron程序能夠週期性的執行任務,但具體執行時間並不肯定。能夠天天、每週、每月週期性的執行任務。當anacron的配置文件發生改變時,下一次anacron運行時會檢查到配置文件的變化。anacron的配置文件爲/etc/anacrontab,編輯須要root權限,默認如下內容:

# 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
複製代碼

能夠看到前三行設置了默認環境,RANDOM_DELAY變量設置了最大延遲執行時間,START_HOURS_RANGE變量設置了anacron任務執行的時間範圍,默認在天天的3點到22點之間。最後三行則設置了三條默認的anacron任務,分別是天天執行,每週執行,每個月執行。

3.1.anacron文件語法

觀察前面三條默認的anacron任務,能夠看到一條anacron任務分爲四個部分,從左到右依次爲:

  • 週期(天):設置任務執行的頻率,以天數爲單位,寫1則表明天天執行,寫3則表明每3天執行,可使用特殊符號「@」,@daily表明天天,@weekly表明每週,@monthly表明每個月。
  • 延遲時間:設置任務的延遲時間,以分鐘爲單位,好比寫5,則當anacron啓動後,anacron等待5分鐘就會執行該任務。設置延遲時間是爲了當機器啓動時不會由於執行不少anacron任務而過載。
  • 任務標識:其目的是識別消息,日誌文件和執行特殊操做。
  • 要執行的命令

在/etc/anacrontab中的三條默認anacron任務中,nice命令用來調整後面命令的優先級,run-parts命令用來執行設置的目錄下的全部腳本,就是說這三條任務分別天天,每週,每個月執行/etc/cron.daily,/etc/cron.weekly,/etc/cron.monthly目錄下的腳本。因此咱們不用本身往/etc/anacrontab中添加anacrontab任務,而只需把腳本放到相應的目錄下,anacron就會週期性的執行這些腳本了。

3.2.anacron如何運行

既然anacron不是守護進程,那它是如何作到週期性執行任務的呢?在centos7下,cron會運行/etc/cron.d/0hourly,在/etc/cron.d/0hourly文件裏,有一條cron任務是這樣的: 01 * * * * root run-parts /etc/cron.hourly 這條cron任務會運行/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

How to use cron in Linux

歡迎瀏覽個人我的博客,https://diwugebingren.github.io

歡迎關注個人公衆號
相關文章
相關標籤/搜索