最新消息:以前的文章会整理补上,如果有时间就来坐坐吧。。。

Linux crontab命令详解

操作系统 麦童 298浏览 0评论

crontab命令概要

crontab命令常见于Linux和类Unix操作系统之中,是一个定期执行指定命令的工具。crontab命令来自英文词组“cron table”的缩写,cron来自于希腊语“chronos”代表时间的意思,table代表了需要定时执行的任务列表。crontab的功能就是管理定时计划任务,配合不同的参数选项实现对定时任务的增、删、改、查,调度的时间间隔精确到分钟级别。

安装Linux或者类Unix操作系统时,部分Linux或者类Unix发行版都会默认安装该工具,其中:

  • cron是服务名称;
  • crond是后台运行的进程名称;
  • rontab是周期性执行的计划任务列表;

Linux调度任务类型

Linux下任务定时调度主要分为两类,分别是系统任务调度和用户任务调度:

系统任务调度

系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。/etc/crontab文件包括下面几行:

# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

01 * * * * root run-parts /etc/cron.hourly
11 9 * * * root run-parts /etc/cron.daily
15 6 * * 0 root run-parts /etc/cron.weekly
35 5 1 * * root run-parts /etc/cron.monthly

前三行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户。

用户任务调度

用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用crontab工具来定制自己的计划任务。所有用户定义的crontab文件都被保存在/var/spool/cron目录中,其文件名与用户名一致。此外crontab命令还支持用户权限控制,主要通过以下两个文件实现:

/etc/cron.deny    #位于该文件中的用户名不能使用crontab
/etc/cron.allow   #位于该文件中的用户名可以使用crontab

如果这两个文件都不存在,那么只有超级用户才被允许使用某个特定的命令。Cron权限也可以使用PAM(Pluggable Authentication Module)认证来限制用户是否可以使用crontab来创建定时任务,PAM配置位于/etc/cron.d/目录下。

crontab命令语法

命令格式

crontab [-u user] file
crontab [-u user] [ -e | -l | -r | -i ]

命令选项

  • -u 用户名:用来设定某个用户的crontab服务,如果未指定默认为当前用户;
  • file:将指定文件做为crontab的任务列表文件并载入crontab,如果在命令行中没有指定该文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab;
  • -e:编辑某个用户的定时任务列表,如未通过-u参数指定用户则默认为当前用户;
  • -l:查看某个用户的定时任务列表,如未通过-u参数指定用户则默认为当前用户;
  • -r:删除某个用户的定时任务列表,如未通过-u参数指定用户则默认为当前用户;
  • -i:删除某个用户的定时任务列表给予提示;

文件格式

crontab文件中,每一行代表一个任务;每行有七列每列代表一项设置,前五列为时间频率设定,第六列是以哪个用户名来执行(该列可省略),第七列为要执行的任务。示例:

minute   hour   day   month   week  user-name	command
# 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 ...
|  |  |  |  |  .------------------- username 
|  |  |  |  |  |            .------ command 
|  |  |  |  |  |            |
*  *  *  *  * user-name  command to be executed
  • minute:表示分钟,取值范围为0到59之间整数值
  • hour:表示小时,取值范围为0到23之间整数值;
  • day of month:表示日期,取值范围为1到31之间整数值;
  • month:表示月份,取值范围为1到12之间整数值;同时支持jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec表示方法;
  • day of week:表示星期,取值范围为0到7之间整数值。其中0或7表示星期天,同时支持sun, mon, tue, wed, thu, fri, sat表示方法;
  • username:指定执行定时任务的用户名;
  • command:要执行的命令,可以是系统命令也可以是脚本文件;

以上字段除了可以使用数字外,还可以使用一下特殊字符表示时间:

特殊字符 含义
*(星号) 表示所有可能的值,可以理解为“每”
,(逗号) 逗号隔开的值表示一个列表范围,如1,2,3 * * * *表示每天每小时的第一、第二、第三分钟执行一次定时任务
-(减号) 减号隔开的值表示一个数值范围,如1-10 * * * *每天每小时的1到10分钟每分钟执行一次定时任务
/n(斜杠) 指定执行任务的间隔频率,如 0 10-18/2 * * *每天的十点到十八点每2小时执行一次定时任务

使用示例

每1分钟执行一次command

* * * * * command

每小时的第5、第10和第15分钟执行一次command

5,10,15 * * * * command

每天晚上20点到22点的第5和第15分钟各执行一次command

5,15 20-22 * * * command

每隔两天的晚上20点到22点的第5和第15分钟各执行一次command

5,15 20-22 */2 * * command

每周一凌晨4点到5点的第5和第15分钟各执行一次command

5,15 4-5 * * 1 command

每天00:30执行系统备份脚本

30 0 * * * /home/micboy/scripts/backup.sh

每小时的第5、第10和第15分钟将系统所有进程保存到日志中

5,10,15 * * * * /usr/bin/ps aux >> /home/micboy/logs/ps.log

每一小时重启重启一次apache

* */1 * * * systemctl restart httpd

在一月的每个星期一上午12:01执行一次更新脚本

01 00 * Jan Monday /home/micboy/scripts/update.sh

指定更新脚本只在第一个星期天执行

通过crontab提供的时间参数不可能实现该功能,但可以使用命令字段中的条件控制语句来实现。

0 2 * * sun  [ $(date +%d) -le 07 ] && /home/micboy/scripts/update.sh

每月1号和15号检查/home挂载的磁盘

0 0 1,15 * * /usr/sbin/fsck /home

每30秒执行一次指定软件更新脚本

crontab命令调度的定时任务时间粒度最小为分钟级,不过可以变相实现。

* * * * * sleep 30; /home/micboy/scripts/update.sh

一行crontab可以配置多个任务,用分号(;)来分隔任务。

* * * * * /home/micboy/scripts/update.sh; /home/micboy/scripts/backup.sh

补充内容

crontab提供了@ 后跟关键字的方式来代替上述五个字段–例如 reboot、yearly、weekly、hourly等。

关键字 等价的crontab表达式 含义
@reboot 重启时执行指定的调度任务
@yearly 0 0 1 1 * 每年执行一次指定的调度任务
@annually 0 0 1 1 * 每年执行一次指定的调度任务
@monthly 0 0 1 * * 每个月执行一次指定的调度任务
@weekly 0 0 * * 0 每个星期执行一次指定的调度任务
@daily 0 0 * * * 每天执行一次指定的调度任务
@hourly 0 * * * * 每小时执行一次指定的调度任务

日常开发或者运维过程中,可以通过访问https://crontab.guru/对自己编写的crontab表达进行校验:

crontab注意事项

  • crontab文件中获取不到系统环境变量的值,如果需要使用请编写脚本在脚本中获取。
  • crontab创建定时任务时,设置的路径一定是绝对路径且目录必须存在才能出结果。
  • 星期几和几号最好不要同时出现,因为它们定义的都是天,非常容易让人理解混乱。
  • 新创建的定时不会马上执行,至少要过2分钟才执行,如果想马上执行请重启cron服务。
  • 更新系统时间时区后需要重启cron服务,在ubuntu中服务名为cron:service cron restart。
  • 当crontab失效时可以尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job执行是否报错tail -f /var/log/cron。
  • 千万不要随意执行crontab -r,该命令将会从Crontab目录(/var/spool/cron)中删除用户的所有Crontab文件,所有crontab创建的定时任务都将被删除。
  • crontab中%有特殊含义,表示换行。如果要用的话必须进行转义%,如经常用的date ‘+%Y%m%d’在crontab中是不会执行的,应该换成date ‘+\%Y\%m\%d’。

转载请注明:麦童博客 » Linux crontab命令详解

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址