使用crontab执行周期任务

Linux ginotang 1508℃ 0评论

crond和crontab

crond是一个守护进程,用于周期性地执行指定的任务。而crontab是一个用于管理这些周期任务的命令,例如添加、删除、查询任务等。

crond每分钟检查相关配置文件,以发现是否有任务被更新,因此crond执行任务的最小时间粒度也是以分钟为单位。

相关配置文件和目录

用户的权限

用户的权限有两种:分别是allow(允许)和deny(禁止)。

配置权限的文件为:

  • /etc/cron.allow
  • /etc/cron.deny

如果cron.allow文件存在,则用户必须添加进这个文件才可以执行cron任务;

如果cron.deny文件存在,则不在这个文件中的用户才能执行cron任务。

cron.allow的优先级高于cron.deny,如果两个文件同时存在,且用户同时在这两个文件中,则cron.allow中的优先生效。系统一般保留cron.deny文件,且该文件是一个空的文件,即默认允许所有人执行cron任务。

注意:root用户不受这些文件的限制,root用户任何时候都可以执行cron任务。当使用su命令提升权限的时候,最好配合-u参数指定执行cron任务的用户。

保存任务的路径

虽然没有明确区分,但cron任务分为系统任务和用户添加的任务。

系统任务保存路径:

  • /etc/crontab    一个普通文件
  • /etc/cron.d/     一个目录

用户添加的任务保存到:

  • /etc/spool/cron/

任务保存到以当前用户名为名称的文件下,假如当前下达cron任务的用户是jack,则他的任务保存到/etc/spool/cron/jack文件中。

cron运行记录

cron的执行日志会被记录到/var/log/cron文件当中。

任务的添加和crontab语法

添加任务

一般来说,我们不会直接通过编辑上面的配置文件来添加任务,而是使用crontab -e命令。

crontab -e命令执行后,会进入一个文本编辑模式,在这个模式下就可以进行任务的添加。例如,可以创建一个任务,在每天12点正执行,任务内容是提醒所有用户记得关闭电脑。

crontab语法

crontab语法栏位

由6个栏位组成,它们分别是分钟、小时、日期、月份、周和命令,如下表:

栏位意思 分钟 小时 日期 月份 命令
可用值 0-59 0-23 1-31 1-12 0-7 需要执行的命令

上面的示例当中,0代表分钟,12表示小时,后面的三个星号分别代表日期、月份和周,最后wall命令开始到最后就是命令栏位。其中周的数值0和7都是表示星期天, 另外,命令中如果涉及文件处理,那么文件的路径必须使用绝对路径。

crontab语法中常见的符号

特殊字符 代表意思
*(星号) 任意时候执行!如果日、月、周都是 * , 就表示“无论何月、何日的星期几的 12:00 都执行“
,(逗号) 用于分隔时段。如:0 3,6 * * * command ,依然是六栏,不过第二栏是 3,6 ,表示在3时和6时执行
-(减号) 在一个时间范围内,如:20 8-12 * * * command, 第二栏是 8-12 ,表示8时至12时,即 8,9,10,11,12 都执行
/n(斜杠) n 代表一个数字,即每隔n个单位执行,如: */5 * * * * command,意思是每5分钟执行,也可以写成 0-59/5

再说crontab配置文件

crontab既是一个命令,也是一个配置文件。前面说过,crontab配置文件在/etc目录下面,主要保存系统的定期任务。相比普通用户的配置文件,crontab文件里面的栏位数目是7栏,在第五栏后面添加了一个执行用户的栏目。下面是crontab配置文件的内容:

因为root是拥有最高权限的用户,它可以指定使用任意用户执行任务,因此,多了一个user-name栏。

cron和anacron

anacron和cron一样,都是用于执行周期性的任务,但是,anacron并不是用于取代cron,而是cron的补充。cron的缺点是:已过期且还没有被执行的任务不会再被执行,过了就是过了。anacron就是为了弥补这个缺点出现的,它会定期执行任务检查,如果发现过期未被执行的任务,则会执行这些任务

anacron的启动方式

crond是一个守护进程,而anacron是一个普通的进程,它由cron启动,每小时一次。前面我们说过,cron会搜索/etc/cron.d目录,并执行里面的任务,而这个目录下面,有一个0hourly文件,添加了如下任务:

任务就是在每小时的第一分钟使用run-parts执行/etc/cron.hourly目录的可执行文件。run-parts的作用就是用于执行特定目录下面的可执行文件

再来看一下/etc/cron.hourly目录,里面0anacron文件的内容:

重点是最后一行,就是这条命令启动了anacron进程, 上面脚本的作用是:检查最近运行的每日任务的日期,如果该日期等于当前日期,则正常退出,否则执行anacron -s命令。

anacron配置文件

anacron运行的时候会读取/etc/anacrontab配置文件。该文件的内容如下:

anacrontab配置文件里面包含三种类型的字符串行:

  • 变量定义
  • 任务描述
  • 空行

变量定义:用于定义执行任务的相关属性。例如RANDOM_DELAY=45,定义一个最大随机延迟时间,这里是45分钟;START_HOURS_RANGE=3-22, 任务会在3点至22点期间执行。

任务描述:任务描述的格式由4个栏位构成,它们分别是

  • 执行周期
  • 延迟时间
  • 任务标识符
  • 将要执行的命令

执行周期:可以是数字,也可以是一个宏,例如1表示一天,可以用宏@daily表示;7表示七天,即1周,可以用宏@weekly表示;月份因为有长有短,一般建议使用宏@monthly表示。

延迟时间:由两个部分构成:一个是配置文件中明确给出的时间,例如上面的5、25、45等,另一个是变量中设置的时间,把这两个时间相加,就是任务的执行延迟时间。

任务标识符:用于在日志文件中标识这个任务,尽量确保这个名称在日志中是唯一的即可。

一般来说一个任务只能写在一行,如果确实想换行,可以使用转义字符”\”(反斜杠)换行。

添加用户任务

从anacrontab配置文件中可以看见,anacron会执行/etc/cron.daily、/etc/cron.weekly和/etc/cron.monthly目录中的任务,如果想要添加用户任务,只需要把它们放到上面三个相对应的目录中即可。

禁用anacron进程

如果确实需要禁用anacron进程,只需要把0anacron任务添加进/etc/cron.hourly/jobs.deny目录即可,如果没有这个目录,自己创建一个。

创建每秒执行的任务

无论是cron还是anacron,它们的时间精度都是分钟,如果希望建立一个每秒执行的任务,建议使用脚本启动该任务,方法是函数的递归(当然循环也可以):

 

转载请注明:Pure nonsense » 使用crontab执行周期任务

喜欢 (0)
0 0 投票数
文章评分
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x
()
x