Linux 命令之 crontab

crontab 簡介

crontab 主要用於須要管理週期執行定時任務的場景shell

crontab 安裝

(有些系統默認已經帶了 crontab,無需安裝的朋友能夠直接跳過本節)vim

安裝:服務器

yum install -y vixie-cron
yum install -y crontabs

啓動:編輯器

systemctl start crond.service

重啓:
systemctl restart crond.service工具

設置開機啓動:測試

systemctl enable crondservice

命令格式

crontab 主要有如下幾種命令格式.net

crontab [-u user] file
crontab [-u user] [-l | -r | -e] [-i] [-s]
crontab -n [ hostname ]
crontab -c

咱們發現crontab 的命令還挺多的,咱們先從最經常使用的開始:3d

crontab -e

這個命令用於編輯定時任務列表,當咱們輸入完命令,按下回車鍵以後,它會使用默認編輯器(一般是vi/vim)打開一個文件,裏面的內容多是這樣子的:
rest

這極可能是你看到的,在設置任何定時任務以前,這裏是看不到任何內容的,若是你已經設置了內容的話,那麼看到的多是這樣的
日誌

這是我提早設置好的定時任務,咱們暫時不解釋這個配置的功能,但從這裏能夠知道,經過 crontab -e 咱們能夠編輯定時任務。
若是咱們什麼都不作,直接退出編輯器會看到如下提示:

若是咱們修改了這個文件,好比增長了一個任務

保存退出以後,咱們能夠看到成功的提示:

若是說,咱們的配置有誤,那麼系統就會提示咱們, 從新編輯,你能夠輸入 y從新編輯 或者 n放棄剛剛的配置的內容

crontab -l

這個命令能夠列出當前的定時任務內容, 這與咱們使用 crontab -e 看到的內容同樣,不一樣的是 crontab -e 能夠編輯,而這裏只能查看

crontab -r

這個命令用於刪除任務列表裏面的內容(在刪除以前咱們先作一個備份)

經過上面的示例能夠看出,執行完 crontab -r 以後,咱們的任務列表被清空了

crontab file

這個命令用於將保存在某個文件中的任務列表中的內容覆蓋到咱們的任務列表中,咱們剛剛在刪除任務列表前作了備份
如今來看一下,使用命令可否將任務列表還原回去

能夠看到,經過 crontab file 命令,咱們將剛剛備份的文件內容恢復到任務列表當中了。
有兩點須要注意:

  • 這個命令的操做很粗暴,會用指定文件的內容直接覆蓋任務列表,使用前必定要想清楚,最好在操做前進行備份
  • 用於覆蓋的文件內容必須是合法的內容,若是語法有誤,內容將不會更新,且會獲得下圖所示的錯誤提示

crontab -ri

這個命令用於刪除任務列表裏面的內容,但會在刪除以前讓你確認是否刪除

你能夠輸入 y 確認刪除,也能夠輸入 n 取消此次操做

crontab -u user_name

這裏咱們補充一點,Linux 中的每一個用戶均可以有本身的定時任務,他們設置的任務被保存在 /var/spool/cron/ 目錄下的同名文件中

這個命令跟 -i 同樣,須要與其它命令配合使用

crontab [-u user] file
crontab [-u user] [-l | -r | -e] [-i] [-s]

不使用 -u 時默認的就是當前用戶,若是你要配置其它用戶的任務列表
就可使用這個命令

crontab -u user -e

固然,使用這個命令的前提是要有對應文件的操做權限,大多數狀況下,這個命令都是 root 在用。

須要注意的是,根據文檔提示,若是你從一個普通用戶 su 到其它用戶,在進行crontab 命令時,就必定要加上 -u 選項。但我實驗發現,su到其它用戶以後,再進行 crontab 操做,默認使用的 su 以後的用戶。

任務列表的語法

接這部分是最重要的任務規則配置環節


上面這個截圖是 /etc/crontab 文件的內容,使用 crontab -e 編輯的語法也這個基本同樣,差異只有 user-name 一項。

使用 crontab -e 無需指定用戶名稱,由於這個命令就是使用用戶本身的身份來執行的。

補充: /etc/crontab 中的內容只能由 root 來設置,通常用於設置系統級的週期任務

從上面的圖裏面能夠知道,週期任務的配置語法由兩部分組成(使用 contab -e 時忽略 user-name)

  • 時間規則
  • 要執行命令或者腳本

時間規則

前面5個 * 分別表明 分、時、日、月、周

  • 第一個 * 表明每一分鐘,也能夠是 0-59 區間中的數字
  • 第二個 * 表明每一個小時,也能夠是 0-23 區間中的數字
  • 第三個 * 表明一個月中的每一天,也能夠是 1-31 區間中的數字
  • 第四個 * 表明一年中的每月, 也能夠是 1-13 區間中的數字,或者使用英文 jan,feb,mar,apr... 等來表示
  • 第五個 * 表明一週中的每一天, 也能夠是 0-6 區間中的數字(星期天使用 0 或者 7 表示),也可使用 sum,mon,tue,wed,thu,fri,sat 來表示

除了上面的配置方式以外,crontab 還支持更靈活的配置方式:

  • * 每一個時間點,如在分鐘單位,則表示每分鐘執行一次,其它時間點同理
  • , 用於鏈接多個時間點,如 1,3,5 指定1,3,5這三個時間點
  • - 用於肯定時間區間,如 2-6 等價於 2,3,4,5,6
  • / 用於每隔一個時間段執行一次,如在分鐘位置設置 */2 表示每兩分鐘執行一次

注意,上述符號中的非標準符號不必定能在你的機器上正常運行,在使用前必定要先進行測試

命令

能夠是shell命令或者執行某個已經寫好的腳本

實例

如下舉幾個實例的例子

# 表示每分鐘執行一次
* * * * * cmd

# 每一個小時的0分和30分執行各執行一次
0,30 * * * * * cmd

# 天天的2點到5點每一個小時的整點執行
0 2-5 * * * cmd

# 每一年的 1月1日0點執行
0 0 1 1 * cmd

# 天天的12點到18點每隔3小時執行一次
0 12-18/3 * * * cmd

# 每月最後的天的22點整執行(非標準語法,要先進行測試再投入生產環境)
0 22 L * * cmd

cron.allow 與 cron.deny

執行cron任務的權限是能夠經過 /etc/cron.allow/etc/cron.deny 兩個文件進行配置。

  • cron.allow 用於配置哪些用戶可使用 crontab
  • cron.deny 用於配置哪些用戶禁止使用 crontab

這兩個文件的內容爲每一行一個用戶名,或者爲空

  • 若是 cron.allow 文件存在的話,須要限權的用戶名必須在這個文件裏面
  • 若是 cron.deny 文件存在的話,須要權限的用戶不能出如今這個文件裏面
  • 若是兩個文件都不存在的話,則只有 root 有權限使用 crontab

當上述兩個文件都不存在時,一個普通使用執行 crontab 命令會獲得如下錯誤

環境變量

在實際使用過程當中, 咱們都會編輯好一個.sh文件,設置好權限(通常是增長執行權限 chmod +x task.sh
測試成功以後,興高采烈地把它添加到 crontab 的任務列表裏面,結果遲遲沒有獲得預期結果。
我以前碰到這樣的狀況,直接執行腳本沒問題,但使用 crontab 執行卻報錯,查看日誌發現是環境變量的問題。
解決的辦法很簡單,只要在腳本內提早導入環境變量便可:

執行結果保存

設置完任務列表以後,咱們最關心的主是任務的執行狀況
能夠在配置任務的時候,在最後加入如下將執行過程當中輸出的內容保存到本身想要的地方。

*/5 * * * * cmd > /var/log/cron_task.log 2>&1 &

語法解析詳見 crontab 腳本錯誤日誌和正確的輸出寫入到文件

日誌文件

咱們能夠查看 /var/log/cron文件的內容來查看服務器執行了哪些任務
(個人是CentOS, 若是是Ubuntu能夠到/var/log/cron.log查看)

待補充

如下幾點是我看了文檔以後還不太明白的幾點(主要仍是英文水平還不夠。。)

  • crontab [-u user] -s
  • crontab -n [hostname]
  • crontab -c
  • /etc/crontab 和 /etc/cron.d 文件內也能夠設置任務列表,具體的使用場景我尚未接觸過

以上全部內容是結合本身的實踐與官方文檔加上網友們的文章寫成,還有不少本身不理解的,但願看到的朋友若是有知道的也評論告訴我哦,謝謝啦

ReadMore

相關文章
相關標籤/搜索