Linux 命令之 - crontab
命令介绍
在介绍 crontab 命令之前,我们首先要介绍一下 crond,因为 crontab 命令需要 crond 服务支持。crond 是 Linux 下用来周期地执行某种任务或等待处理某些事件的一个守护进程,和 Windows 中的计划任务有些类似。
crond 服务的启动和自启动方法如下:systemctl restart cron.service
其实,在安装完成操作系统后,默认会安装 crond 服务工具,且 crond 服务默认就是自启动的。crond 进程每分钟会定期检查是否有要执行的任务,如果有,则会自动执行该任务。
接下来,在介绍 crontab 命令。该命令和 at 命令类似,也是通过 /etc/cron.allow
和 /etc/cron.deny
文件来限制某些用户是否可以使用 crontab 命令的。而且原则也非常相似:
- 当系统中有
/etc/cron.allow
文件时,只有写入此文件的用户可以使用 crontab 命令,没有写入的用户不能使用 crontab 命令。同样,如果有此文件,/etc/cron.deny
文件会被忽略,因为/etc/cron.allow
文件的优先级更高。 - 当系统中只有
/etc/cron.deny
文件时,写入此文件的用户不能使用 crontab 命令,没有写入文件的用户可以使用 crontab 命令。 - 这个规则基本和 at 命令的规则一致,同样是
/etc/cron.allow
文件比/etc/cron.deny
文件的优先级高,Linux 系统中默认只有/etc/cron.deny
文件。
每个用户都可以实现自己的 crontab 定时任务,只需使用这个用户身份执行 crontab -e
命令即可。当然,这个用户不能写入 /etc/cron.deny
文件。
命令格式
crontab 命令的基本格式: crontab [选项] [file]
注意:
这里的 file 指的是命令文件的名字,表示将 file 作为 crontab 的任务列表文件并载入 crontab,若在命令行中未指定文件名,则此命令将接受标准输入(键盘)上键入的命令,并将它们键入 crontab。
该命令常用的选项及各自的含义说明:
其实 crontab 定时任务非常简单,只需执行“crontab -e”命令,然后输入想要定时执行的任务即可。不过,当我们执行“crontab -e”命令时,打开的是一个空文件,而且操作方法和 Vim 是一致的。那么,这个文件的格式才是我们真正需要学习的内容。文件格式如下:
1 | [root@localhost !]# crontab -e |
这个文件中是通过 5 个 *
来确定命令或任务的执行时间的,这 5 个 *
的具体含义如表所示。
在时间表示中,还有一些特殊符号需要学习,如表所示。
当 crontab -e
编辑完成之后,一旦保存退出,那么这个定时任务实际就会写入 /var/spool/cron/
目录中,每个用户的定时任务用自己的用户名进行区分。而且 crontab 命令只要保存就会生效,只要 crond 服务是启动的。知道了这 5 个时间字段的含义,我们多举几个时间的例子来熟悉一下时间字段,如表所示。
现在我们已经对这 5 个时间字段非常熟悉了,可是在“执行的任务”字段中都可以写什么呢?既可以定时执行系统命令,也可以定时执行某个 Shell 脚本,这里举几个实际的例子。
命令实例
实例一:让系统每隔 5 分钟就向 /tmp/test 文件中写入一行“11”,验证一下系统定时任务是否会执行。
1 | [root@localhost ~]# crontab -e |
这个任务在时间工作中没有任何意义,但是可以很简单地验证我们的定时任务是否可以正常执行。如果觉得每隔 5 分钟太长,那就换成“*”,让它每分钟执行一次。而且和 at 命令一样,如果我们定时执行的是系统命令,那么最好使用绝对路径。
实例二:让系统在每周二的凌晨 5 点 05 分重启一次。
1 | [root@localhost ~]# crontab -e |
如果服务器的负载压力比较大,则建议每周重启一次,让系统状态归零。比如绝大多数游戏服务器每周维护一次,维护时最主要的工作就是重启,让系统状态归零。这时可以让我们的服务器自动来定时执行。
实例三:在每月 1 日、10 日、15 日的凌晨 3 点 30 分都定时执行日志备份脚本 autobak.sh。
1 | 30 3 1,10,15 * * /bin/bash /usr/local/sbin/autobak.sh |
这些定时任务保存之后,就可以在指定的时间执行了。我们可以使用命令来查看和删除定时任务,命令如下:
实例四:查看当前用户下的 crontab 任务
参数:-u
1 | [root@ubuntu2204-101 ~ 09:06:30]# crontab -l |
实例五:删除当前用户下的 crontab 任务
参数:-r ,删除当前用户下所有 crontab 任务:
1 | [root@ubuntu2204-101 ~ 09:06:33]# crontab -r |
在书写 crontab 定时任务时,需要注意以下几个事项:
- 6 个选项都不能为空,必须填写。如果不确定,则使用“*”代表任意时间。
- crontab 定时任务的最小有效时间是分钟,最大有效时间是月。像 2018 年某时执行、3 点 30 分 30 秒这样的时间都不能被识别。
- 在定义时间时,日期和星期最好不要在一条定时任务中出现,因为它们都以天为单位,非常容易让管理员混淆。
- 在定时任务中,不管是直接写命令,还是在脚本中写命令,最好都使用绝对路径。有时使用相对路径的命令会报错。
系统的crontab设置
“crontab -e”是每个用户都可以执行的命令,也就是说,不同的用户身份可以执行自己的定时任务。但是有些定时任务需要系统执行,这时就需要编辑 /etc/crontab 这个配置文件了。
当然,并不是说写入 /etc/crontab 配置文件中的定时任务在执行时不需要用户身份,而是“crontab -e”命令在定义定时任务时,默认用户身份是当前登录用户。而在修改 /etc/crontab 配置文件时,定时任务的执行者身份是可以手工指定的。这样定时任务的执行会更加灵活,修改起来也更加方便。
那我们打开这个文件看看吧,如下:
1 | [root@ubuntu2204-101 ~ 09:08:13]# cat /etc/crontab |