Cron

工具型軟件cron是一款類Unix的操作系統下的基於時間的任務管理系統。用戶們可以通過cron在固定時間、日期、間隔下，運行定期任務（可以是命令和腳本）。cron常用於運維和管理，但也可用於其他地方，如：定期下載文件和郵件。cron該詞來源於希臘語chronos（χρόνος），原意是時間。
通常，任務時間表（crontab）文件儲存的指令被crond守護進程啟動，守護進程在後臺運行，並每一分鐘檢查是否有定期的作業需要執行。這類作業一般稱為cron jobs。

**crond守護進程**
crond是一個用於執行週期命令的守護進程。通過守護進程（/lib/systemd/system/crond.service ）形式運行的cron程序稱為crond。 cron會通過以下路徑查找crontabs： - /etc/crontab：為系統任務時間表（crontab）。以前用於跑以日為單位、以周為單位、以月為單位的任務，現在用於跑anacron。- /etc/cron.d/：該目錄包含系統層次的任務時間表（crontabs），不同用戶共同使用。- /var/spool/cron/：該路徑包含用戶通過crontab 命令創建的任務時間表（crontables）。 

**crontab命令**
crontab 命令用於維護每個用戶的任務時間表（crontab）文件。
crontab 命令用於安裝任務時間表（crontab）文件，刪除和列舉 crond守護進程已經在使用的任務時間表（crontab）。每個用戶都會擁有自己獨自的任務時間表（crontab），這些文件會存放在/var/spool/目錄下，不建議用戶直接修改這些文件。MLS模式下的SELinux，你可以為這些任務時間表（crontab）分等級。

**crontab文件**
crontab文件包含crond守護進程所需的一系列作業和指令。
crontab文件的每一行均遵守特定的格式，由空格或tab分隔為數個領域，每個領域可以放置單一或多個數值。

**文件格式**

**用戶文件**
/var/spool/cron/下的任務時間表（crontab）文件是用戶層次的，格式如下：
# 文件格式說明
# ┌──分鐘（0 - 59）
# │ ┌──小時（0 - 23）
# │ │ ┌──日（1 - 31）
# │ │ │ ┌─月（1 - 12）
# │ │ │ │ ┌─星期（0 - 6，表示從週日到週六）
# │ │ │ │ │
# *  *  *  *  * 被執行的命令
注：
# 在某些系統裡，星期日也可以為7
#不很直觀的用法：如果日期和星期同時被設定，那麼其中的一個條件被滿足時，指令便會被執行。請參考下例。
# 前5個域稱之分時日月周，可方便個人記憶。
從第六個域起，指明要執行的命令。

**系統文件**
/etc/crontab和/etc/cron.d/目錄下的任務時間表（crontabs）文件是系統層次的，格式如下：
# 文件格式說明
# ┌──分鐘（0 - 59）
# │ ┌──小時（0 - 23）
# │ │ ┌──日（1 - 31）
# │ │ │ ┌─月（1 - 12）
# │ │ │ │ ┌─星期（0 - 6，表示從週日到週六）
# │ │ │ │ │
# *  *  *  *  *  用戶名 被執行的命令
系統層次的任務時間表（crontabs）的任務經常會指定一個或以上的用戶進行執行，因此任務時間表（crontabs）文件需要增加“用戶名”字段。

**表達式**
在一個區域裡填寫多個數值的方法：
*逗號（,）表示列舉，例如： 1,3,4,7 * * * * echo hello world 表示，在每小時的1、3、4、7分時，打印"hello world"。
*連詞符（-）表示範圍，例如：1-6 * * * * echo hello world ，表示，每小時的1到6分鐘內，每分鐘都會打印"hello world"。
*星號（*）代表任何可能的值。例如：在“小時域”裡的星號等於是“每一個小時”。
*百分號(%) 表示“每"。例如：*%10 * * * * echo hello world 表示，每10分鐘打印一回"hello world"。

**非標準字符**
某些cron程序的擴展版本（如：Quartz Java scheduler）也支持斜線（'/'）操作符，用於表示跳過某些給定的數。例如，“*/3”在小時域中等於“0,3,6,9,12,15,18,21”等被3整除的數；

**例子**

**AIX系統管理員的Crontab文件**
#=============================================================**
#      SYSTEM ACTIVITY REPORTS
#  8am-5pm activity reports every 20 mins during weekdays.
#  activity reports every hour on Saturday and Sunday.
#  6pm-7am activity reports every hour during weekdays.
#  summary prepared at 18:05 every weekday.
#=============================================================**
0,20,40 8-17 * * 1-5 /usr/lib/sa/sa1 1200 3 &
0 * * * 0,6 /usr/lib/sa/sa1 &
0 18-7 * * 1-5 /usr/lib/sa/sa1 &
5 18 * * 1-5 /usr/lib/sa/sa2 -s 8:00 -e 18:01 -i 3600 -ubcwyaqvm &

**常見錯誤**
一個常見的錯誤是，命令行雙引號中使用%時，未加反斜線\，例如：
# 錯誤的例子：
1 2 3 4 5 touch ~/error_`date "+%Y%m%d"`.txt
在守護進程發出的電子郵件中會見到錯誤訊息：
/bin/sh: unexpected EOF while looking for `

# 正確的例子：
1 2 3 4 5 touch ~/right_$(date +\%Y\%m\%d).txt

# 使用單引號也可以解決問題：
1 2 3 4 5 touch ~/error_$(date '+%Y%m%d').txt

# 使用單引號就不用加反斜線了。這個例子會產生這樣一個文件~/error_\2006\04\03.txt
1 2 3 4 5 touch ~/error_$(date '+\%Y\%m\%d').txt
下例是另一個常見錯誤：
# Prepare for the daylight savings time shift
59 1 1-7 4 0 /root/shift_my_times.sh
初看似要在四月的第一個星期日早晨1時59分運行shift_my_times.sh，但是這樣設置不對。
特殊地，當星期域（第五個域）被指定為 * 時，星期域與日域（第三個域）執行“與”操作；而當星期域（第五個域）被指定為 * 以外的內容時，星期域與日域執行“或”操作。
所以這個程序會在4月1日至7日以及4月餘下的每一個星期日執行。
另一個常見錯誤是對分鐘設置的誤用。下例欲一個程序兩個小時運行一次：
# adds date to a log file- 0,2,4,6,8,10,12,14,16,18,20,22 * * * date >> /var/log/date.log
而上述設置會使該程序在偶數小時內的每一分鐘執行一次。正確的設置是：
# runs the date command every even hour at the top of the hour
0 0,2,4,6,8,10,12,14,16,18,20,22 * * * date >> /var/log/date.log
# an even better way
0 */2 * * * date >> /var/log/date.log

**不發送電子郵件**
如果輸出結果來自crontab裡的命令，那麼cron守護進程會用電子郵件將它發給用戶。- 若想關閉某個命令的輸出結果，可以將輸出結果重定向至/dev/null。
>/dev/null 2>&1- 在常用的Vixie cron中，也可以在文件的開始部分加入命令來關閉所有命令的郵件輸出：
MAILTO=""

**cron命令**
/etc/init.d/cron reload
#Reloading configuration files for periodic command scheduler: cron.
/etc/init.d/cron stop
#Stopping cron (via systemctl): cron.service.
/etc/init.d/cron start
#Starting cron (via systemctl): cron.service.
/etc/init.d/cron restart
#Restarting cron (via systemctl): cron.service.
/etc/init.d/cron status

**其他話題**
At：在未來某個時間運行一個作業。
*Anacron：runs job on a periodic interval, anachronistically.
*Launchd：Mac OS X／Darwin cron替代版本。
*Unix程序列表

**參考文獻**

**外部鏈接**

**文檔**
  Crontab : Scheduling Tasksdate=20061019055850 -  Computer Hopedate=20061124012343  Linux / UNIX中crontab的用法-  Opengroup's crontab specificationdate=20050905205441  - UNIX 03正式文檔-  Crontab - Reference and Examples at mkaz.comdate=20070307161417 

**軟件**
  Cron for Windows-  CVSweb for FreeBSD's cron - Paul Vixie的1993 Vixie cron 3.0版本修補了一些錯誤-  fcrondate=20061126105904  - vixiecron / anacron的增強版本（GPL）