工具型软件**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，表示从周日到周六）
# │ │ │ │ │
# *  *  *  *  * 被執行的命令

```

注：

1. 在某些系统里，星期日也可以为7
2. 不很直觀的用法：如果日期和星期同時被設定，那麼其中的一個條件被滿足時，指令便會被執行。請参考下例。
3. 前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程序列表

参考文献
----

1. ↑ . （原始内容存档于2019-12-18）.
2. ↑ . （原始内容存档于2019-12-18）.
3. ↑ . （原始内容存档于2019-12-18）.
4. ↑ . （原始内容存档于2019-12-08）.
5. ↑ . （原始内容存档于2020-02-03）.
6. ↑ . （原始内容存档于2020-02-03）.
7. ↑ . （原始内容存档于2019-12-08）.
8. ↑ . （原始内容存档于2019-12-08）.

外部链接
----

### 文档

* Crontab : Scheduling Tasks（页面存档备份，存于）
* Computer Hope（页面存档备份，存于） Linux / UNIX中crontab的用法
* Opengroup's crontab specification（页面存档备份，存于） - UNIX 03正式文档
* Crontab - Reference and Examples at mkaz.com（页面存档备份，存于）

### 软件

* Cron for Windows
* CVSweb for FreeBSD's cron - Paul Vixie的1993 Vixie cron 3.0版本修补了一些错误
* fcron（页面存档备份，存于） - vixiecron / anacron的增强版本（GPL）

   

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
Unix命令行程序和shell内建命令 |
| --- |
|  |
| 文件系統 | 
* cat
* cd
* chmod
* chown
* chgrp
* cksum
* cmp
* cp
* dd
* du
* df
* file
* fsck
* fuser
* ln
* ls
* mkdir
* mount
* mv
* pax（英语：）
* pwd
* rm
* rmdir
* size
* split
* stat
* tee
* touch
* type（英语：）
* umask（英语：）

 |
|  |
| 程序 | 
* at
* bg
* chroot
* cron
* fg
* kill
* killall（英语：）
* nice
* pgrep
* pkill（英语：）
* ps
* pstree（英语：）
* time
* top

 |
|  |
| 用户环境 | 
* clear
* env
* exit
* history（英语：）
* id
* logname
* mesg（英语：）
* passwd
* su
* sudo
* uptime
* talk（英语：）
* tput（英语：）
* uname
* w
* wall（英语：）
* who
* whoami
* write（英语：）

 |
|  |
| 文本编辑 | 
* awk
* banner（英语：）
* basename
* comm（英语：）
* csplit（英语：）
* cut
* diff
* dirname
* ed
* ex
* fmt（英语：）
* fold（英语：）
* head（英语：）
* iconv
* join（英语：）
* less
* more
* nl（英语：）
* paste（英语：）
* sed
* sort（英语：）
* spell（英语：）
* strings（英语：）
* tail
* tr
* uniq（英语：）
* vi
* wc
* xargs

 |
|  |
| 壳层内建 | 
* alias
* echo
* printf格式字符串
* test（英语：）
* unset
* wait

 |
|  |
| 网络 | 
* dig
* host
* ifconfig
* inetd（英语：）
* netcat
* netstat
* nslookup
* ping
* rdate（英语：）
* rlogin（英语：）
* route
* ssh
* traceroute

 |
|  |
| 查找 | 
* find
* grep
* locate
* whatis（英语：）
* whereis

 |
|  |
| 文档 | 
* apropos（英语：）
* help（英语：）
* man

 |
|  |
| 软件开发 | 
* ar
* ctags
* lex
* make
* nm
* strip
* yacc

 |
|  |
| 杂项 | 
* bc
* cal
* dc
* expr
* lp（英语：）
* lpr
* sleep
* true和false
* yes

 |
|  |
| Unix实用程序列表 |

 |