Linux中的计划任务Crontab

2023-05-16

目录

  • 目录
  • 介绍
  • 安装并检查Crontab服务
  • 入门栗子
  • Crontab的基本组成
    • 用户任务调度
      • crontab命令的使用及相关文件
      • 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

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

参考

  • 每天一个linux命令(50):crontab命令
  • linux crontab 实现每秒执行
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux中的计划任务Crontab 的相关文章

随机推荐

  • 重拾Hibernate框架——入门

    目录 目录Hibernate入门 第一个Hibernate程序 实现数据库操作 Hibernate配置文件详解 Hibernate映射配置文件Hibernate核心配置文件 Hibernate的核心API ConfigurationSess
  • 重拾Hibernate框架——实体类、主键生成策略、session绑定本地线程

    目录 目录实体类持久化类的编写规则Hibernate主键生成策略实体类操作 案例准备对实体类CRUD操作 添加操作查询操作修改操作删除操作saveOrUpdate方法 实体类对象状态Hibernate一级缓存Hibernate事务操作 规范
  • 重拾Hibernate框架——一对多关联

    目录 目录前言一对多映射配置 创建实体类让两个实体类之间相互表示配置映射关系配置核心配置文件Hibernate工具类 一对多关联操作 级联保存级联删除修改操作 inverse属性 前言 这里将以公司和员工为例 xff0c 其中公司与员工是一
  • Visual C++2010学习版详细安装教程

    获取该资源花了本人很长时间 xff0c 为了你们需要VC2010系列的编程软件更容易 xff0c 本人把我找到VC2010系列安装包放在了我的百度网盘分享 xff0c 该资源来之不易 xff0c 请广大朋友们好好珍惜 xff01 由于我换了
  • 重拾Hibernate框架——多对多关联

    目录 目录前言多对多映射配置 创建实体类让两个实体类之间相互表示配置映射关系配置核心配置文件Hibernate工具类 多对多关联操作 级联保存级联删除一般不使用 维护第三张表关系 前言 这里将以用户和角色为例 xff0c 其中用户与角色是多
  • 重拾Hibernate框架——查询操作

    目录 目录前言OID查询对象导航查询HQL查询 查询所有条件查询排序查询分页查询投影查询聚合函数的使用 QBC查询 查询所有条件查询 Restrictions类的常用方法 排序查询 Order类的常用方法 分页查询统计查询 Projecti
  • Struts2框架自学之路——结果页面的配置

    目录 目录Struts2中结果页面的配置 全局结果页面局部结果页面result标签的type属性 Struts2中结果页面的配置 在struts xml核心配置文件中 xff0c 我们可以配置Action类的URL访问路径 xff0c 以及
  • Struts2框架自学之路——Action获取表单数据的方式以及表单数据的封装

    目录 目录Action获取表单数据的方式 通过ActionContext类获取使用ServletActionContext类获取通过特定接口访问在Action中操作域对象 Action中原始方式封装表单数据Struts2中表单数据的封装 属
  • Struts2框架自学之路——值栈

    目录 目录Servlet和Action的区别什么是值栈获取值栈对象值栈的内部结构向值栈存放数据 向值栈存放对象向值栈存放List集合 从值栈获取数据 获取字符串获取对象获取List集合其他操作 EL表达式获取值栈数据 Servlet和Act
  • Struts2框架自学之路——拦截器

    目录 目录Struts2拦截器概述重要知识点自定义拦截器 拦截器的结构自定义登录拦截器 创建登录访问的首页登录页面以及登录操作添加登录拦截器功能 Struts2拦截器概述 Struts2框架封装了很多功能 xff0c 而这些功能大多在拦截器
  • Linux简介及系统安装

    目录 目录Linux简介 Linux的应用Linux与Windows的不同字符界面的优势 Linux系统安装 VMware简介虚拟机的新建与设置注意点Linux的系统分区安装Linux系统Linux系统的安装日志 Linux简介 Linux
  • Linux常用命令

    目录 目录命令基本格式文件处理命令 目录或文件处理Linux中常见目录链接命令 搜索命令 文件搜索命令命令搜索命令字符串搜索命令find命令与grep命令的区别 帮助命令压缩与解压缩命令关机和重启命令其他常用命令 挂载命令用户登录查看和用户
  • 对php-fpm的理解重述

    目录 目录CGI的出现FastCGIphp fpm摘录 FPM的请求处理流程nginx转发请求给FPM 参考 CGI的出现 早期的Web服务器只能处理HTML等静态文件 xff0c 随着PHP等动态语言的出现 xff0c Web Serve
  • Shell编程——基础入门

    目录 目录Shell概述 Shell是什么Shell的分类 脚本执行方式 echo输出命令第一个脚本 Bash的基本功能 命令别名与快捷键历史命令 history命令历史命令的调用命令与文件补全 输入输出重定向 输出重定向输入重定向 多命令
  • Linux命令之<cp命令>

    cp命令用来复制文件或者目录 xff0c 是Linux系统中最常用的命令之一 一般情况下 xff0c shell会设置一个别名 xff0c 在命令行下复制文件时 xff0c 如果目标文件已经存在 xff0c 就会询问是否覆盖 xff0c 不
  • PHPer的进阶探索之旅

    目录 目录前言魔术常量PHP常量详解define和const的区别PHP中的闭包PSR 规范PHP命令空间Web性能优化与HTTP2 前言 作为一个PHPer xff0c 一直认为Java与PHP都 差不多 xff0c 尽管身边的人会说大型
  • Linux下的VIM编辑器

    目录 目录VIM编辑器的概述VIM编辑器的操作模式vim命令的使用操作模式的命令 底行模式的常用指令命令模式的常用指令VIM键位指令图 VIM编辑器的概述 VIM其实VI编辑器的升级版本 VIM相对于VI xff0c 增强的功能 xff1a
  • Linux中的磁盘管理

    目录 目录磁盘管理命令向服务器添加硬盘磁盘分区 分区模式之MBR分区分区模式之GPT分区 分区操作 Linux中的MBR分区Linux中的GPT分区 分区格式化操作挂载分区Linux中的swap分区 磁盘管理命令 xff08 1 xff09
  • Linux中的用户管理

    目录 目录概述关于用户组的配置文件关于用户的配置文件用户和用户组的基本命令 用户组操作用户操作 用户和用户组的进阶命令 主要组与附属组 其他命令 概述 使用操作系统的人 xff0c 我们称之为用户 在Linux中允许多个不同用户同时登录同一
  • Linux中的计划任务Crontab

    目录 目录介绍安装并检查Crontab服务入门栗子Crontab的基本组成 用户任务调度 crontab命令的使用及相关文件Crontab的任务配置格式 系统任务调度系统级任务调度与用户级任务调度 注意事项参考 介绍 Crontab是什么