Linux笔记:使用 cron & at & anacron 定时执行任务
Posted Naisu Xu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux笔记:使用 cron & at & anacron 定时执行任务相关的知识,希望对你有一定的参考价值。
目的
日常或工作使用中经常会有设定某个时间单次或重复执行任务的需求,在linux中实现这些需求最常用的就是 cron & anacron & at 这三个工具了,这篇文章将对这些工具的使用做个简单说明。
cron
cron(crond)是linux下用于定期执行任务的工具。作为用户而言要创建和管理自己的定期执行任务只要使用 crontab
命令就行了。
crontab命令
crontab
命令主要操作的是一个文件,当你初次用该指令建立定期执行任务时会在 /var/spool/cron/crontabs/
目录下生成一个和你用户名相同的文件,这个文件中记录了该用户设置的所有定期执行任务。
任务配置文件格式
在crontab的配置文件中配置任务,每一行为一条任务,以#开头的为注释。每一行开头五个字段为时间相关参数,之后为需要进行的任务命令,参数间用空格隔开。参数顺序和取值如下:
配置文件的编写最主要的是理解时间相关参数,下面是一些例子:
* * * * * command
每分钟执行一次*/10 * * * sun command
每周日每隔十分钟执行一次0 0,12 * * * command
每天0点整和12点整各执行一次0 * 1-3 * * command
每月1号到3号每小时整执行一次0 5 * * 1 command
每周一五点整执行一次
编辑任务配置文件
使用 crontab -e
可以编辑当前用户的任务配置文件,初次打开时可能会提示选择要使用的文本编辑器。下面是个简单的演示:
上面演示中每分钟向log文件输出了时间信息。
如果想要删除任务的话直接在配置文件中删除或是注释掉即可。
除了直接使用 crontab -e
编辑文档,还可以使用 crontab file
将file文件中的任务列表载入到配置文件中。
crontab命令常用选项
选项 | 描述 |
---|---|
-u | 用来设定某个用户的 crontab 服务 |
-e | 编辑用户的配置文件,默认为当前用户 |
-l | 显示用户的配置文件,默认为当前用户 |
-r | 删除用户的配置文件,默认为当前用户 |
-i | 删除用户的配置文件时进行询问 |
cron服务
cron(crond)通常是linux自带的,会随着系统启动。你可以用 /etc/init.d/cron status
命令查看其运行状态。如果使用中工作不正常可以使用 /etc/init.d/cron restart
来重新启动服务。
如果atd服务没有开机启动的话可以使用 chkconfig crond on
命令来将其设置为开机启动。
使用权限
cron(crond)的权限控制是依靠 /etc/cron.allow
(白名单)和 /etc/cron.deny
(黑名单)这两个文件来实现的,如果有权限问题或需求可以查看这两个文件。
更多内容
更多内容可以使用 man cron
、 man crontab
查看相关用户手册。
at
at是一个用于设置在指定时间执行一次任务的工具。
安装
在Raspbian、Ubuntu等系统中可以使用 sudo apt install at
命令来安装 at。
设置定时任务
使用 at timespec
可以启动该工具,然后在之后输入要执行的任务,最后按键盘 ctrl + d
保存并退出。
设置完成后会显示任务编号和执行时间。注意定时任务本身运行时是不会在前台输出信息的。
启动at工具时常用的时间格式主要有下面一些:
格式 | 用法 |
---|---|
HH:MM | 例:15:20,在下一次的15:30运行 |
YY-MM-DD | 例:2021-08-21,在2021年8月21日的当前时间点运行 例:14:00 2021-08-21,在2021年8月21日的14:00运行 |
now + count time-units | 例:now + 5 minutes,在当前时间的5分钟后运行 可用单位:minutes, hours, days, or weeks |
time + count time-units | 例:15:00 + 5 days,在5天后的15:00后运行 |
查询已设置任务
使用 atq
可以查询已设置但还未执行的任务:
atq输出每一行为一个任务,分别显示任务号、执行时间、队列名称、创建者。上面演示中我创建了两个任务,查询时可以看到两行信息。当其中一个任务执行后再次查询就只剩下一个任务了。
删除已设置任务
使用 atrm 任务号
可以删除待进行的任务:
batch命令
at命令还有可附带的命令batch,该命令功能和at基本一样,唯一的区别是使用该命令设置的任务只会在系统空闲时执行。另外使用该命令设置的任务默认队列名称为b
atd服务
使用at方式设置的定时任务依赖于atd服务,可以使用 /etc/init.d/atd status
来查看该服务是否运行,如果没有运行的话使用 /etc/init.d/atd start
来启动。你也可以使用 /etc/init.d/atd stop
来停止该服务。
如果atd服务没有开机启动的话可以使用 chkconfig atd on
命令来将其设置为开机启动。
使用权限
at的权限控制是依靠 /etc/at.allow
(白名单)和 /etc/at.deny
(黑名单)这两个文件来实现的,如果有权限问题或需求可以查看这两个文件。
更多内容
更多内容可以使用 man at
、 man atd
查看相关用户手册。
anacron
使用 crontab
创建的任务有一个问题是,如果系统关机了,关机的期间原本需要执行的任务将不再执行了,anacron就是来对这块进行补充的。
在Raspbian、Ubuntu等系统中可以使用 sudo apt install anacron
命令来安装 anacron。
anacron和cron差不多也有一个配置文件 /etc/anacrontab
,默认情况下其中内容可能如下:
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
HOME=/root
LOGNAME=root
# These replace cron's entries
1 5 cron.daily run-parts --report /etc/cron.daily
7 10 cron.weekly run-parts --report /etc/cron.weekly
@monthly 15 cron.monthly run-parts --report /etc/cron.monthly
最后三行分别是三项任务,相关说明如下:
检查时间 | 延时时间 | 任务名称 | 任务指令 | 描述 |
---|---|---|---|---|
1 | 5 | cron.daily | run-parts --report /etc/cron.daily | 每天延迟5分钟后检查任务 如果超过一条没执行则执行/etc/cron.daily中所有任务 |
7 | 10 | cron.weekly | run-parts --report /etc/cron.weekly | 每周延迟10分钟后检查任务 如果超过一条没执行则执行/etc/cron.weekly中所有任务 |
@monthly | 15 | cron.monthly | run-parts --report /etc/cron.monthly | 每月延迟15分钟后检查任务 如果超过一条没执行则执行/etc/cron.monthly中所有任务 |
上面检查时间至少是以天为单位,或者也可以用@daily 、@weekly、@monthly这些;延时时间以分钟为单位。
把你想要周期执行的任务放到 /etc/cron.{daily,weekly,monthly}
目录中它就会按照上述规则执行了。当然你也可以编写自己的任务规则。
anacron本身也是一条执行,可以控制全体或单条任务相关内容。
更多内容可以参考 man anacron
查看相关用户手册。
总结
Linux中创建定时执行任务还是比较简单的,基本上只要能够理解crontab文件的编写,其它问题都不大。
以上是关于Linux笔记:使用 cron & at & anacron 定时执行任务的主要内容,如果未能解决你的问题,请参考以下文章
linux命令:任务计划crontab anacrontab at cron
2018-04-19 《鸟哥的Linux私房菜 基础学习篇(第四版)》 第15章 例行性工作排程 笔记
脚本控制------------------------(at命令mail命令batch命令cron表格anacron表格)