Linux任務管理工具之 Crontab

來源:互聯網
上載者:User

Linux任務管理工具之 Crontab

Crontab 是 Linux 平台下的一款用於迴圈執行例行任務的工具,Linux 系統由 cron (crond) 這個系統服務來控制任務 , Linux系統本來就有很多的計劃任務需要啟動 , 所以這個系統服務是預設開機啟動的 。 Linux 為使用者提供的計劃任務的命令就是 Crontab

Crontab 是 Linux 下用來周期性執行任務或者等待處理某些事情的時候

Crontab 設定檔

Crontab 的週期性任務主要分為兩種:系統任務 / 使用者任務

  • 系統任務就是系統周期性需要執行的任務,比如說定時執行緩衝清理任務,記錄日誌等等。系統任務的設定檔在 /etc/crontab

這裡是 crontab 的設定檔中的內容

SHELL=/bin/shPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=root# 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

前面 4 行用於配置 cron 的環境變數,環境變數的配置不在這裡討論了,之後的內容是 crontab 的用法的一些簡單的解釋

  • 使用者的週期性任務就可以使用 crontab 工具,所有使用者制定的 crontab 計劃任務都被儲存在 /var/spool/cron 中,檔案名稱即使用者名稱
Crontab 檔案的含義

在上面的crontab檔案中已經包含了一部分的解釋,這裡我將其翻譯為中文

SHELL=/bin/sh        PATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=root# 詳細的解釋可以查看 man 手冊# 舉例:# .---------------- 分 (0 - 59)        # |  .------------- 時 (0 - 23)# |  |  .---------- 日期(每月) (1 - 31)# |  |  |  .------- 月 (1 - 12) 也可以使用月的英文,例如 jan,feb,mar,apr ...# |  |  |  |  .---- 日期(每周) (0 - 6) (周日即是 0 也是 7 )也可以使用sun,mon,tue,wed,thu,fri,sat# |  |  |  |  |# *  *  *  *  * 想要執行命令的使用者(這個參數可以為空白)   你想要執行的命令

Crontab 一共包含包括 7 個欄位,前五個欄位是關於設定執行循環的,第六個欄位用於指定你想要執行的命令的使用者,第七個欄位是要執行的命令

在前5個欄位中,還可以使用以下的特殊字元

星號 (*):代表所有可能的值,例如month欄位如果是星號,則表示在滿足其它欄位的制約條件後每月都執行該命令操作。
逗號 (,):可以用逗號隔開的值指定一個列表範圍,例如,“1,2,5,7,8,9”
中杠 (-):可以用整數之間的中杠表示一個整數範圍,例如“2-6”表示“2,3,4,5,6”
正斜線(/):可以用正斜線指定時間的間隔頻率,例如“0-23/2”表示每兩小時執行一次。同時正斜線可以和星號一起使用,例如*/10,如果用在minute欄位,表示每十分鐘執行一次。

相關的許可權檔案

  • /etc/cron.deny 該檔案中所列的使用者不允許使用 crontab 命令
  • /etc/cron.allow 該檔案中所列的使用者允許使用 crontab 命令
  • /var/spool/cron/ 所有使用者 crontab 檔案存放的目錄,檔案名稱即使用者名稱
Crontab 服務
  • 安裝 Crontab 服務

CentOS 7.x

yum install crontabs

Fedora 23+

dnf install crontabs 

在大多數 Linux 發行版中已經內建的 Crontab ,依舊寫一下安裝方法

  • 啟用服務

    systemctl start crond
  • 停止服務

    systemctl stop crond
  • 查看服務狀態

    systemctl status crond 
  • 加入開機啟動

    systemctl enable crond 
  • 取消開機啟動

    systemctl disable crond 
命令格式詳解
Usage:crontab [options] filecrontab [options]crontab -n [hostname] Options: -u <user>  define user //設定某個使用者的crontab服務,例如,“-u user1”表示設定 user1 使用者的 crontab 服務,此參數一般由root使用者來運行 -e         edit user's crontab //編輯 crontab 檔案內容。如果不指定使用者,則表示編輯目前使用者的crontab檔案 -l         list user's crontab //顯示 crontab 檔案內容,如果不指定使用者,則表示顯示目前使用者的crontab檔案內容 -r         delete user's crontab //刪除某個使用者的 crontab 檔案,如果不指定使用者,則預設刪除目前使用者的crontab檔案,此動作一般由 root 來執行 -i         prompt before deleting //在刪除使用者的crontab檔案時給確認提示 -n <host>  set host in cluster to run users' crontabs //這個選項只有才 cron(8) 才啟用,可以根據已經建立好了的設定檔來指定得對於一個叢集來執行任務 -c         get host in cluster to run users' crontabs //這個選項只有才 cron(8) 才啟用,可以查看叢集目前的狀態,需要和 -n 協同使用 -s         selinux context  //selinux 相關選項 -x <mask>  enable debugging //開啟調試
使用方法
  • 輸入 crontab -e 並斷行符號即可開始編輯目前使用者的 crontab 檔案,編輯完成儲存之後檔案立即生效

預設使用 vi 編輯器,如果想要使用 vim 編輯器或者其他編輯器,可以建立環境變數 EDITOR,變數值為你想要使用的編輯器的指令,例如我想要使用 nano 作為編輯器,就可以執行命令 “export EDITOR=nano” 來添加一個環境變數。
如果想要讓環境變數永久生效,可以將要執行的命令寫入到 “~/.bashrc”中,這樣下次啟動的時候就會自動設定。

  • 如果想要刪除 crontab 檔案可以使用 crontab -r 來刪除目前使用者的 crontab 檔案
  • 想要快速查看 crontab 檔案可以使用命令 crontab -l
備份 crontab 檔案

為了防止檔案被意外刪除 , 我們可以在建立好了 crontab 任務之後備份一下相關的設定檔,筆者的思路是在複製一次當期的文檔並在後面加上 “.backup” 來示意是備份檔案,通常只需要執行以下命令(以 root 使用者為例)

cp /var/spool/cron/root /var/spool/cron/root.bachup

如果目前使用者沒有許可權的話,可以先將自己的設定檔複製到自己的 HOME 目錄下也是可以的

一些簡單的樣本

每個月的 1 號的 2:30 分重啟 Apache 服務

30 2 1 * *  systemctl restart httpd  

每個星期的星期一的早上1點重啟 mariadb

0 1 * * 1 systemctl restart mariadb

更多的樣本可以通過搜尋輕鬆得找到,這裡就不多說了

注意事項

通常來說,我們建立的 crontab 任務都是儲存了之後立即執行的,但是有的時候卻無法執行,將命令單獨拿出來卻可以使用,這個時候��需要檢查一下 crontab 檔案的環境變數是否正常。cron 不是 shell,在執行的時候是不知道環境變數的,所以在指令碼或者說是設定檔中提供必要的環境變數檔案以及路徑,主要注意以下幾點

  1. 設定檔中一點涉及路徑時,使用絕對路徑
  2. 任務執行需要用到 python 或者 java 又或者其他環境變數的時候,需要通過 source 命令引入環境變數
  3. 在某些情況下,手動執行指令碼可以使用,但是放在 Crontab 中就無法執行,就很有可能是由於環境變數引起的故障,可以通過在 crontab 中直接引入環境變數。
其他事項
  • 很奇怪的是在我查閱了很多的資料,發現都說在 crontab 的任務執行完畢之後會向當前系統使用者發送一封郵件,但是我的 crontab 在進行了2天的任務都沒有接收到任何郵件
  • crontab 的檔案剛剛寫入不一定會立即執行,執行的延遲大概在2分鐘左右,如果重啟 crond 服務則立即執行
  • 據說在 crontab 中 % 是有特殊含義的,表示換行的意思。但是在筆者的驗證中沒有發現這一現象
  • 如果只運行 crontab -r 有可能刪除 crontab 目錄下的所有使用者的 crontab

Linux中利用crontab建立計劃任務

Linux中用crontab例行工作安排

Linux crontab不執行問題排查

Ubuntu使用crontab定時任務

Linux計劃任務(at batch crontab anacron)

Linux任務計劃 (at,crontab)

本文永久更新連結地址:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.