Linux中的计划任务Crontab

目录

介绍

  Crontab是什么?
  Crontab是一个用于设置周期性被执行的任务的工具。最短周期可设置为每分钟执行一次。其中,被周期性执行的任务我们称为Cron Job。周期性执行的任务列表我们称为Cron Table。

安装并检查Crontab服务

  • 检查crontab服务
    • 检查crond服务是否启动:service crond status
    • 检查crontab工具是否安装:crontab -l。(实际上这个命令是查看crontab的正在周期执行的任务)
  • 安装cron(一般情况下CentOS均安装了Crontab,无需再次安装)
    • yum install vixie-cron
    • yum install crontabs

入门栗子

  • 每分钟都打印当前时间到一个日志文件中。操作如下:

(1)设置周期执行的任务:

crontab -e

// 在最后加上如下设置
*/1 * * * * date >> /tmp/log.txt

(2) 查看设置的任务,确认是否设置成功:

crontab -l

(3) 查看log.txt文件是否每分钟记录一次当前时间:

tail -f /tmp/log.txt

tail命令用于查看文件底部最后几行的内容。普通的tail命令无法实时查看文件内容的变化情况,需要加入-f参数。如果需要设置查看的行数,可以如tail -10 /tmp/log.txt查看最后10行这样设置。)

Crontab的基本组成

  1. 构成Crontab最主要的组成部分是crond系统服务,该服务每分钟都会从配置文件刷新定时任务。没有该服务也就没有任务的定时执行,所以该服务十分关键。
  2. 配置文件,任务的定义是以文件方式保存的。我们通过配置文件设置定时任务。
  3. 除此之外,为了调整定时任务,还需要一个配置工具,这个配置工具就是crontab。
      值得注意的是,Linux下的任务调度分为系统任务调度和用户任务调度。而之前举的入门栗子中设置的便是用户任务调度。

用户任务调度

  用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。所有用户定义的crontab文件(记录着用户定义的crontab任务列表的文件)都被保存在/var/spool/cron目录中,以用户名为文件名保存对应用户定义的crontab文件。Crontab服务便是从这些配置文件中读取任务列表,执行任务的。
  用户可以使用 Crontab 工具来定制自己的计划任务。下面讲解一下crontab命令的使用及相关文件。

crontab命令的使用及相关文件

crontab命令

usage:  crontab [-u user] file
    crontab [-u user] [ -e | -l | -r ]

命令参数:

  • -u 用户名:用于指定后续操作的是哪个用户的crontab任务。该参数一般是root用户来运行。不指定-u参数则默认crontab命令操作的是当前用户的crontab任务。
  • file:其中file指的是一个任务列表配置文件,我们可以通过文件的形式载入任务。其中文件的内容,如:
*/1 * * * * date >> /tmp/log.txt
45 4 1-10 * * service httpd restart
# 这里面定义了多个任务
  • -e:添加crontab任务。实际上这里是操作的/var/spool/cron/用户名文件的内容。因此,如果我们直接修改(如果有权限的话)/var/spool/cron/某个用户的用户名的内容的话,相当于为该用户定义任务列表。
  • -l:查看crontab任务列表。实际上这里查看的是/var/spool/cron/用户名文件的内容。如果没有使用-u参数指定用户名的话,这里的“用户名”指的是当前用户的用户名。
  • -r:删除用户的crontab。实际上这里删除的就是/var/spool/cron/用户名这一份crontab任务配置文件。因此,我们在实际添加crontab任务的时候,一般是以文件的形式导入,导入成功后会在/var/spool/cron/目录下生成对应用户的任务配置文件。如果因为该命令误删了用户定义的crontab任务,也不至于丢失原来的任务信息。因为我们保留了原文件。
  • tail -f /var/log/cron:查看crontab任务执行记录。
  • tail -f /var/spool/mail/用户名:以邮件形式发送任务的执行信息给任务所属用户。
      可见,设置用户的crontab任务,关键的是用户对应的/var/spool/cron/用户名这一crontab任务配置文件。

Crontab的任务配置格式

*  *  *  *  * command to be executed
|  |  |  |  |
|  |  |  |  .---- 星期0~70或者7表示星期天) OR sun,mon,tue,wed,thu,fri,sat
|  |  |  .------- 月份1~12 OR jan,feb,mar,apr ...
|  |  .---------- 日期1~31
|  .------------- 小时0~23
.---------------- 分钟0~59

栗子:
- 每晚的21:30重启apache

30 21 * * * service httpd restart
  • 每月1、10、22日的4:45重启apache
45 4 1,10,22 * * service httpd restart
  • 每月1到10日的4:45重启apache
45 4 1-10 * * service httpd restart
  • 每隔两分钟重启apache
*/2 * * * * service httpd restart
  • 1-59分钟间每隔两分钟重启apache
1-59/2 * * * * service httpd restart
  • 晚上11点到早上7点之前,每隔一小时重启apache
0 23-7/1 * * * service httpd restart
  • 每天18:00至23:00之间每隔30分钟重启apache
0,30 18-23 * * * service httpd restart
0-59/30 18-23 * * * service httpd restart
*/30 18-23 * * * service httpd restart

总结
- *表示任何时候都匹配
- 可以用“A,B,C”表示A或者B或者C时执行命令
- 可以用“A-B”表示A到B之间时执行命令
- 可以用“*/A”表示每A分钟(小时等)执行一次命令

系统任务调度

  系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。/etc/crontab是系统任务调度的配置文件。该文件内容大致如下:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# 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

  其中,第三行MAILTO变量指定了cron的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户。在这个文件中配置的所有任务的执行信息都只会发送给MAILTO变量配置了的用户。如root用户,那么root用户可以通过tail -f /var/spool/mail/root查看邮件形式的任务执行信息。
  这里主要关注的是crontab任务的配置。在文件的内容中我们可以从注释看出:

# *  *  *  *  * user-name  command to be executed

  系统crontab和用户crontab任务的配置大致一样。不同的是系统crontab任务需要设置user-name 用户名的值,指明系统crontab任务所属用户。其他参数的使用同上述提及的任务的配置。采用crontab相关命令都并不影响系统crontab任务的配置。系统crontab任务的配置均通过/etc/crontab该配置文件来操作。操作正确后crontab任务立即生效。
  系统级别的crontab任务同样也可以通过tail -f /var/log/cron命令查看crontab任务执行记录。
  此外,还有另外几个文件的说明。
/etc/cron.deny:该文件中所列用户不允许使用crontab命令。(在文件中设置用户名)此时如果用户使用crontab命令,会显示如下提示:

[wml@localhost ~]$ crontab -l
You (wml) are not allowed to use this program (crontab)
See crontab(1) for more information

/etc/cron.allow:该文件中所列用户允许使用crontab命令。(在文件中设置用户名)

系统级任务调度与用户级任务调度

  系统级任务调度主要完成系统的一些维护操作,用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议这么做),但是反过来却不行,root用户的任务调度操作可以通过“crontab –uroot –e”来设置,也可以将调度任务直接写入/etc/crontab文件,需要注意的是,如果要定义一个定时重启系统的任务,就必须将任务放到/etc/crontab文件,即使在root用户下创建一个定时重启系统的任务也是无效的。(摘自:每天一个linux命令(50):crontab命令

注意事项

(1)任务配置中第三和第五个域之间执行的是“或”操作。如:
  四月的第一个星期日早晨1时59分运行a.sh

59 1 1-7 4 0 /root/a.sh

  上面的写法是错误的。这样写的意思则表示:四月的1到7号或者四月的星期日,它们中的早晨1时59分运行a.sh。正确写法应该是不设置第五个域,并在执行脚本前判断当天是否为星期日。如下:

59 1 1-7 4 * test `date +\%w` -eq 0 && /root/a.sh

  对于命令date +%w来说并不需要添加\,在crontab任务中则需要添加。
  或:

59 1 1-7 4 * test `date +\%w` = 0 && /root/a.sh

  注意这里“=”两边需要有空格。为什么?test命令判断后面的条件是否成立。
  echo $?命令返回的是上个命令的结果。如果返回值是0,就是上个命令执行成功;如果是返回值是0以外的值,就是失败。
  对于test 1=0命令,来说总是成功的,即返回0。实际上我们认为0并不等于1。我们需要使用test 1 = 0。如下:

test 1 = 0
echo $?

(2)Crontab中最小只能设置到每分钟执行一次命令,如果想每半分钟执行某个命令怎么做到呢?
采用sleep,让命令执行时暂停。如:

*/1 * * * * date >> /tmp/date.log
*/1 * * * * sleep 30s; date >> /tmp/date.log

  如果需要控制的粒度更小,可以查看下述的操作文章。

参考

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值