在日常中,我们常常需要linux
系统来执行定时任务。而这时就需要我们使用crontab
命令来完成此项任务。
crontab 命令介绍
crontab
命令被用于提交和管理用户提交的需要定期执行的任务。而crontab
命令需要crond
服务支持。crond
是Linux
下用来周期地执行某种任务或等待处理某些事件的一个守护进程。在安装linux系统时,crond
一般会被自动安装。我们可以通过如下的命令查看、启动、重启crond
服务。
$ service crond status # 查看crond状态
$ service crond start # 启动crond服务
$ service crond restart # 重启crond服务
crontab 语法
Usage:
crontab [options] file
crontab [options]
crontab -n [hostname]
Options:
-u <user> define user
# 用来设定某个用户的 crontab 服务,例如 "-u demo" 表示设备 demo用户的 crontab 服务,此选项一般有 root 用户来运行。
-e edit user's crontab 、
# 编辑某个用户的 crontab 文件内容。如果不指定用户,则表示编辑当前用户的 crontab 文件。
-l list user's crontab
# 显示某用户的 crontab 文件内容,如果不指定用户,则表示显示当前用户的 crontab 文件内容。
-r delete user's crontab
# 从 /var/spool/cron 删除某用户的 crontab 文件,如果不指定用户,则默认删除当前用户的 crontab 文件。
-i prompt before deleting
# 在删除用户的 crontab 文件时,给确认提示。
-n <host> set host in cluster to run users' crontabs
-c get host in cluster to run users' crontabs
-s selinux context
-x <mask> enable debugging
注意:这里的 file 指的是包含待执行任务的crontab
文件。
任务的定义
crontab
文件的含义:用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
minute hour day month week command
其中:
- minute: 表示分钟,可以是从0到59之间的任何整数。
- hour:表示小时,可以是从0到23之间的任何整数。
- day:表示日期,可以是从1到31之间的任何整数。
- month:表示月份,可以是从1到12之间的任何整数。
- week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
- command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
在以上各个字段中,还可以使用以下特殊字符:
- 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
- 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
- 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
- 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
注意:在定义任务时,我们可以分别以周或者是日月为单位作为循环,但我们不可使用 几月几号且为星期几 的模式工作。
下面的例子是一个错误的写法:
30 12 11 9 5 root echo "test mission"
设置定时任务
我们可以如下的几种方式进行定时任务的设置。
- 用户定时任务:使用
crontab -e
命令
用户定时任务:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。
我们可以使用crontab -e
进入某个用户的定时任务编辑界面。如果不指定用户的话,则进入当
前用户的编辑界面。在编辑界面中,一行表示一个定时任务。如下图所示,编辑界面含有两个定时任务。
- 系统定时任务:编辑
/etc/crontab
文件
系统定时任务:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc
目录下有一个crontab文件,这个就是系统任务调度的配置文件。
首先,我们先来看看文件的内容。使用cat /etc/crontab
,内容如下。
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO= root
HOME=/
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
51 * * * * root run-parts /etc/cron.hourly
24 7 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
前面四行是用来配置crond
任务运行的环境。
第一行:指定了环境所使用的shell。
第二行:指定了系统执行命令的路径。
第三行:指定了crond
的任务执行信息将通过电子邮件发送的用户,这里发给root用户。如果为空,则不发给任何人。
第四行:指定了执行命令或者脚本时的主目录。
下面的几行,则是系统执行的任务。每个任务占据一行。
注意:在这里定义任务时,需要指定用户。而用户任务则不需要。
crontab 相关配置文件
- 用户权限文件
\etc\cron.deny
\etc\cron.allow
使用说明:
- 当系统中有
/etc/cron.allow
文件时,只有写入此文件的用户可以使用crontab
命令,没有写入的用户不能使用 crontab 命令。同样,如果有此文件,/etc/cron.deny
文件会被忽略,因为/etc/cron.allow
文件的优先级更高。 - 当系统中只有
/etc/cron.deny
文件时,写入此文件的用户不能使用crontab
命令,没有写入文件的用户可以使用crontab
命令。 - Linux 系统中默认只有
/etc/cron.deny
文件。
- 用户任务存放目录
/etc/spool/cron/
说明:所有用户crontab文件存放的目录,以用户名命名。
cron.daily
、cron.hourly
、cron.weekly
和cron.monthly
目录
/etc/cron.daily/
/etc/cron.hourly/
/etc/cron.weekly/
/etc/cron.monthly/
说明:在四个文件夹里面存放了crond
按天、小时、周和月执行的脚本。
解释:
看一下 anacrontab
这个配置文件中的代码:
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
在系统启动时会读取一次 anacrontab
中的配置参数。
这里以每天举例。在读取完成 anacrontab
文件后,crond
程序会在每天的 4点12分 左右执行一次 cron.daily
下的文件。
参考
- https://www.runoob.com/w3cnote/linux-crontab-tasks.html
- http://c.biancheng.net/view/1092.html
- https://www.cnblogs.com/ftl1012/p/crontab.html
- https://man.linuxde.net/crontab
- https://www.cnblogs.com/xd502djj/p/4292781.html
- https://www.zhihu.com/question/57000081/answer/301299818