Linux/UNIX 定时任务 cron 详解
cron crontab 定时任务
![](/data/attachment/album/201606/28/155407teajtncbtgt4ptk4.png)


### 导言


![](/data/attachment/album/201606/28/155408xjf3eeflwfl36fw6.gif)


<ruby> 定时任务 <rp>  （ </rp> <rt>  cron job </rt> <rp>  ） </rp></ruby>被用于安排那些需要被周期性执行的命令。利用它，你可以配置某些命令或者脚本，让它们在某个设定的时间内周期性地运行。`cron` 是 Linux 或者类 Unix 系统中最为实用的工具之一。cron 服务（守护进程）在系统后台运行，并且会持续地检查 `/etc/crontab` 文件和 `/etc/cron.*/`目录。它同样也会检查 `/var/spool/cron/` 目录。


### crontab 命令


`crontab` 是用来安装、卸载或者列出定时任务列表的命令。cron 配置文件则用于驱动 `Vixie Cron` 的 [cron(8)](http://www.manpager.com/linux/man8/cron.8.html) 守护进程。每个用户都可以拥有自己的 crontab 文件，虽然这些文件都位于 `/var/spool/cron/crontabs` 目录中，但并不意味着你可以直接编辑它们。你需要通过 `crontab` 命令来编辑或者配置你自己的定时任务。


### 定时配置文件的类型


配置文件分为以下不同的类型：


* **UNIX 或 Linux 的系统级 crontab** : 此类型通常由那些需要 root 或类似权限的系统服务和重要任务使用。第六个字段（见下方的字段介绍）为用户名，用来指定此命令以哪个用户身份来执行。如此一来，系统的 `crontab` 就能够以任意用户的身份来执行操作。
* **用户的 crontab**: 用户可以使用 `crontab` 命令来安装属于他们自己的定时任务。 第六个字段为需要运行的命令, 所有的命令都会以创建该 crontab 任务的用户的身份运行。


**注意**: 这种问答形式的 `Cron` 实现由 Paul Vixie 编写而成，并且被包含在许多 [Linux](http://www.linuxsecrets.com/) 发行版本和类 Unix 系统（如广受欢迎的第四版 BSD）中。它的语法被各种 crond 的实现所[兼容](http://www.linuxsecrets.com/linux-hardware/)。


那么我该如何安装、创建或者编辑我自己的定时任务呢？


要编辑你的 crontab 文件，需要在 Linux 或 Unix 的 shell 提示符后键入以下命令：



```
$ crontab -e

```

`crontab` 语法（字段介绍）


语法为：



```
1 2 3 4 5 /path/to/command arg1 arg2

```

或者



```
1 2 3 4 5 /root/ntp_sync.sh

```

其中：


* 第1个字段：分钟 (0-59)
* 第2个字段：小时 (0-23)
* 第3个字段：日期 (1-31)
* 第4个字段：月份 (1-12 [12 代表 December])
* 第5个字段：一周当中的某天 (0-7 [7 或 0 代表星期天])
* /path/to/command - 计划执行的脚本或命令的名称


便于记忆的格式：



```
* * * * * 要执行的命令
----------------
| | | | |
| | | | ---- 周当中的某天 (0 - 7) (周日为 0 或 7)
| | | ------ 月份 (1 - 12)
| | -------- 一月当中的某天 (1 - 31)
| ---------- 小时 (0 - 23)
------------ 分钟 (0 - 59)

```

简单的 `crontab` 示例：



```
### 每隔 5 分钟运行一次 backupscript 脚本 ##
*/5 * * * * /root/backupscript.sh

### 每天的凌晨 1 点运行 backupscript 脚本 ##
0 1 * * * /root/backupscript.sh

### 每月的第一个凌晨 3:15 运行 backupscript 脚本 ##
15 3 1 * * /root/backupscript.sh

```

### 如何使用操作符


操作符允许你为一个字段指定多个值，这里有三个操作符可供使用：


* **星号 (**`*`**)** : 此操作符为字段指定所有可用的值。举个例子，在小时字段中，一个星号等同于每个小时；在月份字段中，一个星号则等同于每月。
* **逗号 (**`,`**)** : 这个操作符指定了一个包含多个值的列表，例如：`1,5,10,15,20,25`.
* **横杠 (**`-`**)** : 此操作符指定了一个值的范围，例如：`5-15` ，等同于使用逗号操作符键入的 `5,6,7,8,9,...,13,14,15`。
* **分隔符 (**`/`**)** : 此操作符指定了一个步进值，例如： `0-23/` 可以用于小时字段来指定某个命令每小时被执行一次。步进值也可以跟在星号操作符后边，如果你希望命令行每 2 小时执行一次，则可以使用 `*/2`。


### 如何禁用邮件输出


默认情况下，某个命令或者脚本的输出内容（如果有的话）会发送到你的本地邮箱账户中。若想停止接收 `crontab` 发送的邮件，需要添加 `>/dev/null 2>&1` 这段内容到执行的命令的后面，例如：



```
0 3 * * * /root/backup.sh >/dev/null 2>&1

```

如果想将输出内容发送到特定的邮件账户中，比如说 vivek@nixcraft.in 这个邮箱， 则你需要像下面这样定义一个 MAILTO 变量：



```
MAILTO="vivek@nixcraft.in"
0 3 * * * /root/backup.sh >/dev/null 2>&1

```

访问 “[禁用 Crontab 命令的邮件提示](http://www.cyberciti.biz/faq/disable-the-mail-alert-by-crontab-command/)” 查看更多信息。


### 任务：列出你所有的定时任务


键入以下命令：



```
# crontab -l
# crontab -u username -l

```

要删除所有的定时任务，可以使用如下命令：



```
### 删除当前定时任务
crontab -r

```


```
### 删除某用户名下的定时任务，此命令需以 root 用户身份执行
crontab -r -u username

```

### 使用特殊字符串来节省时间


你可以使用以下 8 个特殊字符串中的其中一个替代头五个字段，这样不但可以节省你的时间，还可以提高可读性。




| 特殊字符 | 含义 |
| --- | --- |
| @reboot | 在每次启动时运行一次 |
| @yearly | 每年运行一次,等同于 “0 0 1 1 \*”. |
| @annually | (同 @yearly) |
| @monthly | 每月运行一次, 等同于 “0 0 1 \* \*”. |
| @weekly | 每周运行一次, 等同于 “0 0 \* \* 0”. |
| @daily | 每天运行一次, 等同于 “0 0 \* \* \*”. |
| @midnight | (同 @daily) |
| @hourly | 每小时运行一次, 等同于 “0 \* \* \* \*”. |


示例：


#### 每小时运行一次 ntpdate 命令



```
@hourly /path/to/ntpdate

```

### 关于 `/etc/crontab` 文件和 `/etc/cron.d/*` 目录的更多内容


`/etc/crontab` 是系统的 crontab 文件。通常只被 root 用户或守护进程用于配置系统级别的任务。每个单独的用户必须像上面介绍的那样使用 `crontab` 命令来安装和编辑自己的任务。`/var/spool/cron/` 或者 `/var/cron/tabs/` 目录存放了个人用户的 crontab 文件，它应该备份在用户的家目录当中。


### 理解默认的 `/etc/crontab` 文件


典型的 `/etc/crontab` 文件内容是这样的：



```
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

```

首先，环境变量必须被定义。如果 SHELL 行被忽略，cron 会使用默认的 sh shell。如果 PATH 变量被忽略，就没有默认的搜索路径，所有的文件都需要使用绝对路径来定位。如果 HOME 变量被忽略，cron 会使用调用者（用户）的家目录替代。


另外，cron 会读取 `/etc/cron.d/`目录中的文件。通常情况下，像 sa-update 或者 sysstat 这样的系统守护进程会将他们的定时任务存放在此处。作为 root 用户或者超级用户，你可以使用以下目录来配置你的定时任务。你可以直接将脚本放到这里。`run-parts`命令会通过 `/etc/crontab` 文件来运行位于某个目录中的脚本或者程序。




| 目录 | 描述 |
| --- | --- |
| /etc/cron.d/ | 将所有的脚本文件放在此处，并从 /etc/crontab 文件中调用它们。 |
| /etc/cron.daily/ | 运行需要 每天 运行一次的脚本 |
| /etc/cron.hourly/ | 运行需要 每小时 运行一次的脚本 |
| /etc/cron.monthly/ | 运行需要 每月 运行一次的脚本 |
| /etc/cron.weekly/ | 运行需要 每周 运行一次的脚本 |


### 备份定时任务



```
# crontab -l > /path/to/file

# crontab -u user -l > /path/to/file

```



---


via: <https://www.unixmen.com/add-cron-jobs-linux-unix/>


作者：[Duy NguyenViet](https://www.unixmen.com/author/duynv/) 译者：[mr-ping](https://github.com/mr-ping) 校对：[FSSlc](https://github.com/FSSlc)


本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


OK
**Introduction**

Cron job are used to schedule commands to be executed periodically. You can setup commands or scripts, which will repeatedly run at a set time. Cron is one of the most useful tool in Linux or UNIX like operating systems. The cron service (daemon) runs in the background and constantly checks the /etc/crontab file, and /etc/cron.*/ directories. It also checks the /var/spool/cron/ directory.

**Command of crontab**

crontab is the command used to install, deinstall or list the tables (cron configuration file) used to drive the [cron(8)](http://www.manpager.com/linux/man8/cron.8.html) daemon in Vixie Cron. Each user can have their own crontab file, and though these are files in /var/spool/cron/crontabs, they are not intended to be edited directly. You need to use crontab command for editing or setting up your own cron jobs.

**Types of cron configuration files**

There are different types of configuration files:

**The UNIX / Linux system crontab **: Usually, used by system services and critical jobs that requires root like privileges. The sixth field (see below for field description) is the name of a user for the command to run as. This gives the system crontab the ability to run commands as any user.

**The user crontabs: **User can install their own cron jobs using the crontab command. The sixth field is the command to run, and all commands run as the user who created the crontab

**Note:** This faq features cron implementations written by Paul Vixie and included in many [Linux](http://www.linuxsecrets.com/) distributions and Unix like systems such as in the popular 4th BSD edition. The syntax is [compatible](http://www.linuxsecrets.com/linux-hardware/) with various implementations of crond.

How Do I install or create or edit my own cron jobs?

To edit your crontab file, type the following command at the UNIX / Linux shell prompt:

$ crontab -e

Syntax of crontab (field description)

The syntax is:

1 2 3 4 5 /path/to/command arg1 arg2

OR

1 2 3 4 5 /root/ntp_sync.sh

Where,

- 1: Minute (0-59)
- 2: Hours (0-23)
- 3: Day (0-31)
- 4: Month (0-12 [12 == December])
- 5: Day of the week(0-7 [7 or 0 == sunday])
- /path/to/command – Script or command name to schedule

Easy to remember format:

* * * * * command to be executed

– – – – –

| | | | |

| | | | —– Day of week (0 – 7) (Sunday=0 or 7)

| | | ——- Month (1 – 12)

| | ——— Day of month (1 – 31)

| ———– Hour (0 – 23)

————- Minute (0 – 59)


Example simple crontab.

|
## run backupscript 5 minutes 1 time ##
*/5 * * * * /root/backupscript.sh ## Run backupscript daily on 1:00 am ## 0 1 * * * /root/backupscript.sh ## Run backup script monthly on the 1st of month 3:15 am ## 15 3 1 * * /root/backupscript.sh |


**How do I use operators?**

An operator allows you to specifying multiple values in a field. There are three operators:

**The asterisk (*********) **: This operator specifies all possible values for a field. For example, an asterisk in the hour time field would be equivalent to every hour or an asterisk in the month field would be equivalent to every month

**The comma (****,****)** : This operator specifies a list of values, for example: “1,5,10,15,20, 25”.

**The dash (****–****)** : This operator specifies a range of values, for example: “5-15” days , which is equivalent to typing “5,6,7,8,9,….,13,14,15” using the comma operator.

**The separator (****/****)** : This operator specifies a step value, for example: “0-23/” can be used in the hours field to specify command execution every other hour. Steps are also permitted after an asterisk, so if you want to say every two hours, just use */2.


**Use special string to save time**

Instead of the first five fields, you can use any one of eight special strings. It will not just save your time but it will improve readability.

Special string | Meaning |

@reboot | Run once, at startup. |

@yearly | Run once a year, “0 0 1 1 *”. |

@annually | (same as @yearly) |

@monthly | Run once a month, “0 0 1 * *”. |

@weekly | Run once a week, “0 0 * * 0”. |

@daily | Run once a day, “0 0 * * *”. |

@midnight | (same as @daily) |

@hourly | Run once an hour, “0 * * * *”. |



Examples


#### Run ntpdate command every hour ####

@hourly /path/to/ntpdate


**More about /etc/crontab file and /etc/cron.d/* directories**

**/etc/crontab **is system crontabs file. Usually only used by root user or daemons to configure system wide jobs. All individual user must must use crontab command to install and edit their jobs as described above. /var/spool/cron/ or /var/cron/tabs/ is directory for personal user crontab files. It must be backup with users home directory.

Understanding Default /etc/crontab

Typical /etc/crontab file entries:

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

HOME=/

# run-parts

01 * * * * root run-parts /etc/cron.hourly

02 4 * * * root run-parts /etc/cron.daily

22 4 * * 0 root run-parts /etc/cron.weekly

42 4 1 * * root run-parts /etc/cron.monthly

First, the environment must be defined. If the shell line is omitted, cron will use the default, which is sh. If the PATH variable is omitted, no default will be used and file locations will need to be absolute. If HOME is omitted, cron will use the invoking users home directory.

Additionally, cron reads the files in /etc/cron.d/ directory. Usually system daemon such as sa-update or sysstat places their cronjob here. As a root user or superuser you can use following directories to configure cron jobs. You can directly drop your scripts here. The run-parts command run scripts or programs in a directory via /etc/crontab file:

Directory | Description |

/etc/cron.d/ | Put all scripts here and call them from /etc/crontab file. |

/etc/cron.daily/ | Run all scripts once a day |

/etc/cron.hourly/ | Run all scripts once an hour |

/etc/cron.monthly/ | Run all scripts once a month |

/etc/cron.weekly/ | Run all scripts once a week |



**Backup cronjob**

# crontab -l > /path/to/file

# crontab -u user -l > /path/to/file