Linux-定时任务(crontab)

本文详细介绍了Linux系统中的定时任务管理,包括at和cron两种主要的定时任务类型,它们的区别及使用方法。同时,深入探讨了anacron如何处理系统停机期间的定时任务,确保任务在重启后能够正确执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.什么是定时任务

通过定时让系统在规定的时间去执行任务。

2.定时任务的种类:at和cron

定时任务有两种工作方式:一是例行性的,就是每隔一定的周期就要执行一次的任务,使用at来实现;二是突发性的,就是执行完一次就不再执行的任务,使用crontab实现。

at:用于处理仅执行一次任务的指令。要执行at,需要atd服务的支持。
atd服务下载路径:
http://rpmfind.net/linux/centos/7.7.1908/os/x86_64/Packages/at-3.1.13-24.el7.x86_64.rpm

crontab:用于周期性执行任务的指令。周期的时间可以是分钟,小时,周,月,年等。crontab除了可以使用指令执行外,还可以通过编辑/etc/crontab来实现。要使得crontab可以生效,需要crond服务的支持。

3.at单次执行任务的运作方式

使用at来执行任务时,一种方式是将任务以文本文件的方式写入/var/spool/at/目录下,就可以等待atd服务的调用和执行了;第二种是使用at命令,进入到at shell环境执行所需的命令。

对于at,可以使用/etc/at.allow和/etc/at.deny这两个文件来进行at的使用限制。有了这两个文件的情况下,at的工作情况如下:

  1. 先寻找/etc/at.allow文件,写在这个文件中的使用者才能使用at,否则不能(即使在at.deny文件中没有写)。
  2. 如果/etc/at.allow不存在,就寻找/etc/at.deny文件,写在这个文件中的使用者不能使用at,没有被卸载文件中的使用者可以使用at。
  3. 如果两个文件都不存在,则只有root可以使用at。
4.at的使用方式

#at [-mldv] TIME

#at -c 工作号

选项与参数:

  1. -m:当at的工作完成后,即使没有输出信息,也通过email通知使用者。
  2. -l:at -l相当于atq,列出当前系统上的所有用户的at任务。
  3. -d:at -d相当于atrm,可以取消一个在at中的任务。
  4. -v:可以使用较明显的时间格式列出at任务的任务表。
  5. -c:可以列出后边接的该项任务的实际指令内容。
  6. TIME:时间格式,可以定义出【什么时候要进行at任务】的时间,格式有:
  • HH:MM ex> 04:00 在今天的HH:MM时刻进行,若时间已超过,则明天的HH:MM时刻进行。
  • HH:MM YYYY-MM-DD ex> 04:00 2020-03-31 强制在某年某月某日的规定时刻进行。
  • HH:MM[am|pm] [Month] [Date] ex> 04pm July 30 强制在某月某日的规定时刻进行,am和pm分别代表上午和下午。
  • HH:MM[am|pm] + number [minutes|hours|days|weeks] ex> now + 5 minutes 或 ex> 04pm + 3 days 在当前或某个时间点,再加一段时间。

示例:让系统在10分钟后关机

#at now + 10 minutes  (注意单位要加s,使用at时会进入下边的at shell的环境来让用户下达命令,建议命令中路径使用绝对路径。)
at> /bin/sync    
at> /bin/sync
at> /sbin/shutdown -h now
at> <EOT>    (此处输入[ctrl]+d就会出现<EOT>的字样,表示结束。)
job 1 at Tue Mar 31 15:54:00 2020   (此处会显示刚刚输入的指令编号和执行时间)
5.指令的删除

atq:查询当前主机上有多少的at任务。

atrm+任务号:指定移除任务。

6.crontab周期性执行任务的运作方式

周期执行任务是由cron(crond)服务来控制的。

对于周期性执行任务,使用的则是crontab命令。

对于crontab,同样可以使用/etc/cron.allow和/etc/cron.deny这两个文件来进行crontab的使用限制。有了这两个文件的情况下,crontab的工作情况如下:

先寻找/etc/cron.allow文件,写在这个文件中的使用者才能使用crontab,否则不能(即使在cron.deny文件中没有写)。
如果/etc/cron.allow不存在,就寻找/etc/cron.deny文件,写在这个文件中的使用者不能使用crontab,没有被卸载文件中的使用者可以使用crontab。
如果两个文件都不存在,则只有root可以使用crontab。

当用户使用crontab命令建立任务后,任务就会被记录到/var/spool/cron/中,并且以账号来作为判别的。

7.crontab的使用方式

#crontab [-u username] [-l|-e|-r]

选项和参数:

  1. -u:只有root才能进行这个任务,也可帮助其他使用者建立或删除crontab任务
  2. -e:编辑crontab的任务内容
  3. -l:查看crontab的任务内容
  4. -r:移除所有的crontab的任务内容,若仅移除一项,请用-e去编辑移除。

实例:用root的身份在每天的12:00发信给自己

#crontab -e (使用此命令时也可以不需要指定身份,即不需要加root字段)
0 12 * * * mail -s "at 12:00" root < /home/root/.bashrc

每项任务的格式都具有六个字段,分别的意义为:

代表意义分钟小时日期月份指令
数字范围0-590-231-311-120-7实际指令

特别注意周的数字中的0和7都是代表星期天的意思

另外还有一些辅助的字符,意义如下:

特殊字符代表意义
*表示任何时刻都接受的意思,举例日,月,周都是*的话就代表不论何月何日的星期几都执行。*同样可以使用表1中的数字范围来表示,意义相同。
,表示分割时段的意思,举例任务时间是每天的3点和6点,则表示为0 3,6 * * * command
-表示一段时间范围内,举例8点到12点之间的每小时的20分钟都执行一次任务,则表示为 20 8-12 * * * command
/nn代表数字,表示[每隔n单位间隔]的意思,举例每5分钟执行一次任务,则表示为*/5 * * * * command
8.crontab的系统配置文件

另外还可以使用编辑/etc/crontab文件的方式,来执行周期性任务。crontab每分钟会读取一次/etc/crontab的任务内容。如果因为某些原因或是其他的Unix系统中,由于crontab是读到内存中的,所有在修改完/etc/crontab文件时,可能并不会马上执行,需要重新启动crond服务。

配置文件中的参数解释:

MAILTO=root 当/etc/crontab文件中的任务指令发生错误时,或者该任务的执行结果有STDOUT/STDERR时,会将错误信息或者屏幕显示的信息传给谁。

PATH=xxx 执行文件的搜寻路径。

[分 时 日 月 周 身份 指令]字段的设定 在/etc/crontab需要指定身份。

9.crond服务读取配置文件的位置

一般情况下,crond预设有三个地方会有执行脚本的配置文件,分别是:

  • /etc/crontab
  • /etc/cron.d/*
  • /var/spool/cron/*
10.可唤醒停机期间的工作任务anacron

什么是anacron:

anacron不是用来取代crontab的,而是用来处理在系统非启动状态下的crontab任务执行的,以及因为某些原因导致的超时而没有没执行的任务。

anacron也是每小时被cron执行一次的,然后anacron再去检测相关的任务有没有被执行,如果有超时的工作在,就执行任务,执行完毕或无需执行任务时,anacron就停止了。

anacron是怎么在停机的状态下还能够执行任务的?anacron会读取时间记录文件,会去分析现在的时间和时间记录文件所记载的上次执行anacron的时间,如果两者有差异,则在某些时刻没有进行crontab,此时anacron会开始执行未进行的crontab任务了。

anacro和/etc/anacrontab:

anacron其实是程序而非服务,在CentOS当中已经进入crontab的任务中,同时anacronb会每小时被执行一次,并且anacron的配置文件放在了/etc/cron.hourly中。

anacron的语法如下:

#anacron [-sfn] [job]
#anacron -u [job]

选项和参数:

  1. -s:开始连续的执行各项工作(job),会一句时间记录文件的数据判断是否进行。
  2. -f:强制进行,而不去判断时间记录文件的时间戳。
  3. -n:立刻进行未进行的任务,而不延迟(delay)等待时间。
  4. -u:仅更新时间记录文件的时间戳,不进行任何操作。
  5. job:由/etc/anacrontab定义的各项工作名称。

anacron的配置文件:/etc/anacrontab

RANDOM_DELAY=45 #随机给予最大延迟时间,单位是分钟

START_HOURS_RANGE=3-22 #延迟多少个小时内应该要执行的任务时间

1       5       cron.daily              nice run-parts /etc/cron.daily
7       25      cron.weekly             nice run-parts /etc/cron.weekly
@monthly 45     cron.monthly            nice run-parts /etc/cron.monthly
  • 第一列-天数:anacron执行当下与时间戳(/var/spool/anacron/内的时间记录文件)相差的天数,若超过此天数,就准备开始执行,否则不执行。
  • 第二列-延迟时间:若确定超过天数导致要执行任务了,设置延迟执行的时间,防止立即启动会有其他资源冲突的问题。
  • 第三列-工作名称的定义:在/var/log/cron中记载该项任务的名称,通常与后续的目录资源名称相同即可。
  • 第四列-实际要执行的指令串:即要执行的命令

对于第一个任务,示例具体的执行流程如下:

  1. 由/etc/anacrontab分析到cron.daily这项工作名称的天数为1天。
  2. 由/var/spool/anacron/cron.daily取出最近一次执行anacron的时间戳。
  3. 由上个步骤与目前的时间比较,若差异天数为1天以上(含1天),就准备执行指令。
  4. 若准备执行指令,根据/etc/anacrontab的设定,将延迟5分钟+3小时(由START_HOURS_RANGE设定)。
  5. 延迟时间后,开始执行后续指令,即[run-parts /etc/cron.daily]指令。
  6. 执行完毕后,anacron程序结束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

顽强的韭菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值