Linux crontab定时任务的使用

时间:2021-02-02 07:57:17

crontab是Unix和Linux用于设置周期性被执行的软件包,服务器上很多系统任务都会周期性执行,比如重启某个服务器,定期清理日志等。这就可以使用crontab。将任务注册到cron进程查看的配置文件中,这样cron周期性地查看这些配置文件时,将会执行设置好的定时任务。在实际开发和部署中,大部分程序都不需要定时自维护,只需要写好自己的业务逻辑,通过crond这个工业级程序调度即可。


cron

cron是一个系统Daemon进程,一般挂在init下。笔者的kali2中cron这个进程就是挂在init下。这个进程主要工作是定期检查用户注册的任务信息,并调用相应的任务执行。所以当用户新加入了定时任务后,也不需要重启此进程,cron会自动检测和维护一个作业列表。


crontab

这是一个cron注册信息的工具。cron不提倡直接编辑注册信息文件,使用这个crontab可以比较容易的完成注册工作。注意,这个工具是针对各个用户的,并非针对系统管理员,对于系统管理员,则可以直接编辑/etc/crontab文件进行任务配置,作系统级配置。


简单使用

假设如下命令希望每天每隔一分钟执行一次:

date >> /var/log/date_testing
则我们可以使用crontab来注册这一任务

crontab -e
首次打开可能会需要你选择默认的编辑器,自己选择即可,我选择的vim basic。之后就可以开始写上配置信息:

* * * * * date >> /var/log/date_testing

上例五个星号代表运行时间,分别是 :分 时 日 月  每周的日。星号代表任意值,也就是说,任意年,任意月,任意时,任意分,任意日,都执行后接的命令。关于时间格式,下文讲解。保存文件退出后,使用如下命令将会看到刚才注册的任务:

crontab -l
这样,查看日志文件/var/log/date_testing即可看到每分钟执行的输出。 注意:在一般情况下,若没有设置命令输出重定向(date是有输出的,输出到stdout),则以邮件的形式发送到运行的用户信箱。久而久之这些信息会非常大,可能需要人工处理。所以妥善管理任务程序的输出是比较好的选择


时间格式
上文例子中提到了任务注册的时间格式。以下是具体的时间格式讲解。

字段 值范围
minute 0-59
hour 0-23
day of month 0-31
month 1-12或name
day of week 0-7或name

除了具体值,指定在具体某一时刻(如分字段的6代表每小时第6分钟,月字段的3代表每年的3月),还可以使用通配符和其他描述符号。

*代表取任意值,如在分字段上标示任意分钟都会执行,每一分钟;在月字段上表示每一月都会执行。

-代表取某个范围(短横线,减号)。如在时字段上取值1-18表示每天1时到18时,这期间每个小时。分字段上的5-10表示每小时的第五分钟到第十分钟,这期间每分钟。

,代表具体值枚举(逗号)。比如分字段上的2,3,4,8表示每小时中第二、第三、第四、第八分时刻。

/n代表每隔 n 单位间隔,n 代表间隔多长,例如每五分钟进行一次,则可在分字段标示0-59/5,在0-59时间段里每五分钟里。这个符号一般与上面三个符号连用。

注意:周与日月不能同时设定,这样可能cron无法准确获取时间。周字段中0代表周天。

上面可能说的模棱两可,下面有些例子,可以帮助理解:

43 21 * * *              21:43 执行
15 05 * * * 05:15 执行
0 17 * * * 17:00 执行
0 17 * * 1 每周一的 17:00 执行
0,10 17 * * 0,2,3 每周日,周二,周三的 17:00和 17:10 执行
0-10 17 1 * * 毎月1日从 17:00到7:10 毎隔1分钟 执行
0 0 1,15 * * 毎月1日和 15日和 一日的 0:00 执行
42 4 1 * * 毎月1日的 4:42分 执行
0 21 * * 1-6 周一到周六 21:00 执行
0,10,20,30,40,50 * * * * 每隔10分 执行
*/10 * * * * 每隔10分 执行
* 1 * * * 从1:0到1:59 每分钟 执行
0 1 * * * 1:00 执行
0 */1 * * * 毎时0分 每隔1小时 执行
0 * * * * 毎时0分 每隔1小时 执行
2 8-20/3 * * * 8:02,11:02,14:02,17:02,20:02 执行
30 5 1,15 * * 1日 和 15日的 5:30 执行
例子是网上找的,但也都可以用,笔者已经检查过。


其他

这里主要说一些自己查到和翻阅manpage看到的内容
1) Debian中的cron增加了一个系统级任务特性,这个特性一般便于系统管理,在/etc/目录下有基于时(cron.hourly)、日(cron.daily)、月(cron.monthly)、周(cron.weekly)的任务注册文件,系统级任务都将记录注册在这些文件中。并且作业通过run-parts调用。


2)当使用crontab注册任务时,是为用户注册,非管理员,当然管理员也可以通过这个工具注册。注册的作业并不是存放在/etc/crontab文件,而是按照用户不同,在目录/var/sqool/cron下创建以用户名命名的目录,并将注册信息填写在此目录的文件中。


3)/etc/crontab文件一般给管理员用户查看。


4)在Debian下cron的日志写在syslog中,可以在/var/log/syslog中查看。


写在后面

本文中有很多信息来自互联网,例子都经过测试,在kali2系统(基于Debian)上无误。若有不足或错误,欢迎各位指正。