首页 > 系统相关 >Linux中的计划任务Crontab

Linux中的计划任务Crontab

时间:2022-11-28 18:32:47浏览次数:51  
标签:用户 crontab cron 命令 任务 Crontab Linux 任务调度


目录

  • ​​目录​​
  • ​​介绍​​
  • ​​安装并检查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~7(0或者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 实现每秒执行​​


标签:用户,crontab,cron,命令,任务,Crontab,Linux,任务调度
From: https://blog.51cto.com/u_15894233/5893374

相关文章

  • Linux安装tesseract教程
    前言因为之前做一个登陆获取Cookie来记录登陆状态的功能时。需要识别登陆时的验证码。原本是在本地测试,后来上线那么没办法也就需要在Linux环境下再安装一下Tesseract-OCR......
  • Linux实验2:CENTOS7下的用户管理和权限设置
    一、实验目的掌握创建用户和用户组的方法;掌握文件的权限设置方法。二、实验任务1.新增加一个组名为student,密码为123。2.新增加一个用户名为zhouxingchi,其附属组......
  • Linux
    1.在第三步前得先进入到redis文件里cd redis...然后再安装gcc 在linux启动进入src再命令  Ctrlc停止进程想让前台霸屏的服务弄到后台的方法,让redis服务到后......
  • Linux:CentOS release 8.5 安装Mysql5.7
    添加Mysqlyum存储库下载安装软件包#下载软件包wgethttps://dev.mysql.com/get/mysql80-community-release-el7-6.noarch.rpm#安装软件包rpm-Uvhmysql80-commun......
  • 第五周(ssh服务,samba服务,Linux上布置网站)
    一:ssh服务1:开启ssh服务测试Linux是否开启ssh服务。systemctl status ssh  显示ssh服务并没有开启,此时我们需要开启ssh服务systemctlst......
  • linux grep shell相关
     ​​http://www.2cto.com/os/201307/224496.html​​​​http://wenda.so.com/q/1365651781067621​​grep​​http://blog.sina.com.cn/s/blog_406127500101dljv.html​......
  • Linux 下的 systemctl 启动/关闭/启用/禁用服务
    Linux下的systemctl启动/关闭/启用/禁用服务1、启动服务systemctlstart<服务名>2、停止服务systemctlstop<服务名>3、重启服务systemctlrestart<服务名>......
  • Linux软连接和硬链接
    1.Linux链接概念Linux链接分两种,一种被称为硬链接(HardLink),另一种被称为符号链接(SymbolicLink)。默认情况下,ln命令产生硬链接。【硬连接】硬连接指通过索引节点来进行连接。......
  • Linux笔记分享-crazychao
    Linux-CentOS6.5安装JDK和eclipse步骤JDK下载页面:​​http://www.oracle.com/technetwork/java/javase/downloads/index.html​​1、若之前没有装过,卸载系统自带的j......
  • linux日志筛选命令
    (1)Linux目录操作命令cd..退出当前目录,返回上一级目录;cd/退出当前目录,返回根目录;mkdir命令用于创建一个新的目录;rmdir命令功能删除指定的空目录。(2)Linux筛选日志......