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表达式基本都是通用的。