通过 cron 设置定时任务

1. 说明

1.1. 关于操作系统及参数

VPS 的系统是 Debian9

crontab 的存储路径为/var/spool/cron/crontabs

2. 概念讲解

cron 是一个守护进程(伴随着电脑一起运行的程序),通过读取配置文件 crontab(cron table)来定时执行 crontab 这个文件中的命令。补充一点,每个用户都可以拥有一个自己的 crontab 文件。

简单来说,cron 负责干活,crontab 负责告诉 cron 怎么干,所以我们要做的就是把我们想要定时执行的命令写入 crontab 中。

3. 安装 cron 及开机自启

大多数系统均预装 cron,如果没有的话自己装

1
$ apt install cron

设置开机自启

1
$ systemctl enable cron # 设置 cron 开机自启

如果出现

1
2
Synchronizing state of cron.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable cron

执行

1
$ /lib/systemd/systemd-sysv-install enable cron

4. crontab 命令配置 crontab 文件

1
$ crontab [-u user] [file address] [ -e | -l | -r ]

其中 [-e | -l | -r] 是对 crontab 配置文件层面的操作

  1. [-u user] 指定某个用户的 crontab 文件,默认为当前用户
  2. [file address] 从指定位置读取配置信息到crontabs中(只有创建或更新 crontab 的时候会用到这个参数)
  3. [-e] 编辑某个用户的 crontab 文件(默认当前用户)
  4. [-l] 列出某个用户的 crontab 文件中的定时任务(默认当前用户)
  5. [-r] 删除某个用户的 crontab 文件(默认当前用户)

5. crontab 怎么写

每一个定时任务在 crontab 中是一行,比如

1
0 0 1,2,19,20 * * /usr/bin/cerbot renew

表示每个月的 1,2,19,20 号的 0 点 0 分执行/usr/bin/cerbot renew,具体内容接下来展开说:

1
2
3
4
5
6
7
8
# ┌──── minute (0 - 59)
# │ ┌──── hour (0 - 23)
# │ │ ┌─── day of the month (1 - 31)
# │ │ │ ┌──── month (1 - 12)
# │ │ │ │ ┌──── day of the week (0 - 6)
# │ │ │ │ │
# │ │ │ │ │
# * * * * * command to execute

通常情况下,每个命令由 6 个部分组成,有些系统会更多,但是这 6 个是通用的。

以下讲解每一部分中常用的 3 个符号,-以及/

第一列是分钟,第二列是小时,剩下的部分类似。如果一个部分要填多个可以用,比如,每个月的 1,2,19,20 号,就在 day 的那一栏填入1,2,19,20,逗号隔开即可。如果想表达连续的范围,比如每个月的 3 号到 10 号,当然可以用3,4,5,6,7,8,9,10,但是略显长,可以用3-10来替代更加简洁。至于*就是表示这个部分所有的值。还有/表示间隔频率,如刚刚表示 3 月到 10 月每两个月执行一次的改为3-10/2表示 3 月到 10 月,每两个月执行一次。

6. 怎么建立属于自己的 crontab

6.1. 设置环境变量

编辑当前用户home目录下的.profile文件(.profile 文件用来设置当前用户的环境变量)。在其中加入

1
2
# 以下指明编辑器用 vi,可以安装自己喜欢的更换
EDITOR=vi; export EDITOR

6.2. 创建 crontab 文件

1
2
$ vi filename # 自己决定文件名
$ crontab filename # 执行后,系统在/var/spool/cron/crontabs 创建与用户名同名的文件,将 filename 中的内容 copy 过去