天天看点

linux的crontab可以支持简单的定时任务场景,没人不知道吧

作者:云中漫步

crontab 命令简介

Linux下的crontab命令用于维护crontab文件或cron表。

cron表包含在系统上定期运行的命令列表。

每个用户都可以有自己的crontab。

读取crontab并在正确的时间执行命令的守护进程称为cron。它是以希腊时间之神克洛诺斯的名字命名的。

cron作业有助于系统管理员在后台自动执行重要任务。

crontab的配置文件

对于个别用户,可以允许或禁止Cron作业。

/etc/cron.allow: 必须在此文件中列出用户,用户才被允许运行cron作业。

/etc/cron.deny:如果文件cron.allow不存在,除了cron.deny文件中的用户外,所有其他用户允许运行cron作业。

如果两个文件都不存在,那么只有超级管理员可以执行cron作业。

linux crontab 格式

Crontab文件位于/var/spool/cron/crontabs目录中。

用户只能使用crontab命令编辑crontab文件。

crontabs文件中的每个cron作业后面都有5个时间字段。时间字段采用24小时格式。

MIN HOUR DOM MON DOW COMMAND
           

下表是各个字段的意义以及允许的值。

Field Description Allowed Value
MIN 分钟 Minute field 0-59
HOUR 小时 Hour field 0-23
DOM 月份的第几天 Day of Month 1-31
MON 月份 Month field 1-12
DOW 周的第几天 Day Of Week 0-6
CMD 命令 Command Any command to be executed.

可以将时间字段设置成 (*) ,表示每一个。举个例子,如果想每一周都执行一个任务,则可以使用*设置DOW字段。

也可以设置范围,比如 (9-5) 。

可以设置一个列表,比如(1,3,5,8) 。

为了更好地可读性,MON和DOW还可以使用英文的前三个字母来设置,比如 sun, mon, jan, feb等等。

实例

1 列举当前用户的cron任务

可以使用-l参数查看当前登录用户的cron任务列表。命令格式:

$ crontab -l
           

示例:

yunzhong@DESKTOP-9VB7LN7:~$ crontab -l
no crontab for yunzhong
yunzhong@DESKTOP-9VB7LN7:~$ crontab -l
0 0 * * * ls /
           

2 使用crontab 命令编辑用户cron任务列表

参数为-e,命令格式如下:

$ crontab -e
           

3 添加一个指定时间执行的任务

如上文,通过crontab -e修改cron文件,添加待执行的任务及执行时间。

第一次添加任务,会发现很多#开头的内容。这些都是注释,可以删除。

# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command

0 0 * * * ls /
           

4 每天早上八点执行cron任务

可以设置每天定时执行,这里设置每天早上八点定时执行任务。

设置内容:

0 8 * * * myscript.sh
           

5 任务每天执行多次

我们可以设定多个时间,用逗号分割。

下例子是每天早上八点和晚上八点执行myscript.sh脚本。

0 8,20 * * * myscript.sh
           

6 一条设定执行多个任务

我们可以通过一条cron任务,执行多个任务。

下面的例子,是每天早上八点执行脚本myscript.sh以及myscript2.sh。

0 8 * * * myscript.sh; myscript2.sh
           

7 一年执行一次的任务设置

按照上面介绍的设置格式,每年执行一次的任务可以通过如下方式设置:

0 0 1 1 *
# 每年的第一天凌晨执行
           

我们还可以使用@yearly和@annually实现。下面的例子和前面的实现功能一致。

@yearly myscript.sh
           

8 固定周期的设置方式

对于每个月执行一次,每周执行一次的情况,我们可以用更简单的方式配置。和上面的类似,我们可以指定更多的执行一次。如下表。

表达式 意义 执行时间
@monthly 每个月的第一天执行 0 0 1 * *
@weekly 每周的第一天执行 0 0 * * 0
@daily 每天开始的时候执行一次 0 0 * * *
@hourly 每个小时执行一次 0 * * * *

9 系统reboot时执行

可以使用@reboot命令在系统重新启动时调度作业。它允许用户在每次系统启动时自动运行任务。

@reboot myscript.sh
           

10 查看其他用户的定时任务

可以使用参数-u设定其他用户,配合-l参数可以查看其他用户的定时任务配置信息。当然,需要root权限。

命令格式:

$ sudo crontab -u deepak -l
           

示例:

yunzhong@DESKTOP-9VB7LN7:~$ sudo crontab -u test1 -l
[sudo] password for yunzhong:
no crontab for test1

           

11 修改其他用户的设置

和上面类似,可以通过-u参数和-e参数配合,修改其他用户的执行计划。

$ sudo crontab -u test1 -e
           

12 使用crontab 命令删除用户crontab设置

可以使用-r参数删除当前登录用户的crontab。

yunzhong@DESKTOP-9VB7LN7:~$ crontab -r
yunzhong@DESKTOP-9VB7LN7:~$ crontab -l
no crontab for yunzhong
           

同理,可以使用-u参数,删除其他用户的crontab设置。

$ sudo crontab -u test1 -r
           

13 删除前确认

我们可以通过-r删除定时任务设置,为了误删,可以让用户再次确认。-i命令会让用户再次确认是否删除。

命令格式:

$ crontab -i -r
           

示例:

yunzhong@DESKTOP-9VB7LN7:~$ crontab -r -i
crontab: really delete yunzhong's crontab? (y/n) y
           

总结

总的来说,linux定时任务的设置还是很简单的。

其中最重要的,还是理解cron表达式。不光是linux的crontab,其他的定时任务工具(比如quartz),cron表达式基本都是通用的。

继续阅读