Crontab 是 Linux 平臺下的一款用于循環執行例行任務的工具,Linux 系統由 cron (crond) 這個系統服務來控制任務 , Linux系統本來就有很多的計劃任務需要啟動 , 所以這個系統服務是默認開機啟動的 。 Linux 為使用者提供的計劃任務的命令就是 Crontab
Crontab 是 Linux 下用來周期性執行任務或者等待處理某些事情的時候
Crontab 配置文件
Crontab 的周期性任務主要分為兩種:系統任務 / 用戶任務
- 系統任務就是系統周期性需要執行的任務,比如說定時執行緩存清理任務,記錄日志等等。系統任務的配置文件在 /etc/crontab
這里是 crontab 的配置文件中的內容
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=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/bin
MAILTO=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] file
crontab [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,在執行的時候是不知道環境變量的,所以在腳本或者說是配置文件中提供必要的環境變量文件以及路徑,主要注意以下幾點
- 配置文件中一點涉及路徑時,使用絕對路徑
- 任務執行需要用到 python 或者 java 又或者其他環境變量的時候,需要通過 source 命令引入環境變量
- 在某些情況下,手動執行腳本可以使用,但是放在 Crontab 中就無法執行,就很有可能是由于環境變量引起的故障,可以通過在 crontab 中直接引入環境變量。
其他事項
- 很奇怪的是在我查閱了很多的資料,發現都說在 crontab 的任務執行完畢之后會向當前系統用戶發送一封郵件,但是我的 crontab 在進行了2天的任務都沒有接收到任何郵件
- crontab 的文件剛剛寫入不一定會立即執行,執行的延遲大概在2分鐘左右,如果重啟 crond 服務則立即執行
- 據說在 crontab 中 % 是有特殊含義的,表示換行的意思。但是在筆者的驗證中沒有發現這一現象
- 如果只運行 crontab -r 有可能刪除 crontab 目錄下的所有用戶的 crontab