通过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
9
# ┌──── 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过去