前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux中定时任务(上)

Linux中定时任务(上)

原创
作者头像
陈不成i
修改2021-05-27 14:32:25
6720
修改2021-05-27 14:32:25
举报
文章被收录于专栏:ops技术分享

一.简介

定时任务基本概念: (1).crond是一个daemon类程序,路径为/usr/sbin/crond。默认会以后台方式启动,service或systemd方式启动crond默认也是后台方式的。

(2).crondtab是管理crontab file的工具,而crontab file是定义定时任务条目的文件。

(3).crontab file存在于多处,包括系统定时任务文件/etc/crontab和/etc/cron.d/*,还有独属于各用户的任务文件/var/spool/cron/USERNAME。

crontab命令:

  1. -l:列出定时任务条目
  2. -r:删除当前任务列表终端所有任务条目
  3. -i:删除条目时提示是否真的要删除
  4. -e:编辑定时任务文件,实际上编辑的是/var/spool/cron/*文件
  5. -u:操作指定用户的定时任务

执行crontab -e命令编辑当前用户的crontab file,例如当前为root用户,则编辑的是/var/spool/cron/root文件。例如写入下面这一行。

  1. * * * * * /bin/echo "the first cron entry" >>/tmp/crond.txt

这将会每分钟执行一次echo命令,将内容追加到/tmp/crond.txt文件中。

任务计划中的任务条目如何定义,可以查看/etc/crontab文件。

  1. [root@server2 ~]# cat /etc/crontab
  2. SHELL=/bin/bash
  3. PATH=/sbin:/bin:/usr/sbin:/usr/bin
  4. MAILTO=root
  5. # For details see man 4 crontabs
  6. # Example of job definition:
  7. # .---------------- minute (0 - 59)
  8. # | .------------- hour (0 - 23)
  9. # | | .---------- day of month (1 - 31)
  10. # | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
  11. # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
  12. # | | | | |
  13. # * * * * * user-name command to be executed

在此文件中定义了3个变量,其中一个是PATH,该变量极其重要。在最后还给出了任务条目的定义方式:

(1).每个任务条目分为6段,每段以空格分隔,之所以此处多了user-name段是因为/etc/crontab为系统定时任务文件,而一般定时任务是没有该段的。

(2).前五段为时间的设定段,分别表示”分时日月周”,它们的定义不能超出合理值范围,第六段为所要执行的命令或脚本任务段。

(3).在时间定义段中,使用”“表示每单位,即每分钟,每小时,每天,每月,每周几(仍然是每天)。实际上,按man文档中解释,”“表示的是从每个时间段的起始到结尾,也就是全部时间单位的意思。例如在小时上设置*,表示0,1,2,3…22,23的意思。

(4).每个时间段中,都可以使用逗号”,”来表示枚举,例如定义”0,30,50 * * * *”表示每个时辰的整点、第30分钟和第50分钟都执行该任务。

(5).每个时间段中,都可以使用”-“定义范围,可以结合逗号使用。如分钟段定义了”00,20-30,50”表示每个时辰的整点、第20到30分钟的每分钟、第50分钟都执行该任务。

(6).每个时间段中,使用”/“表示忽略时间,如在小时段定义了”0-13/2”表示在”0/2/4/6/8/10/12”点才满足时间定义。常使用”*/N”表示每隔多久的意思。例如”00 */2 * * *”表示在每天每隔两小时的整点执行该任务(严格地说是0-23/2,也就是0,2,4,…,22,所以凌晨1点不会执行任务)。

(7).如果定义的日和周冲突了,则会多次执行(不包括因为*号导致的冲突)。例如每月的15号执行该任务,同时又定义了周三执行该任务,正常无冲突情况下,将在周三和每月15号执行,但如果某月的15号同时是周三,则该任务在此日执行两次。因此,应该尽力避免同时定义周和日的任务。

(8).命令段(即第6段)中,不能随意出现百分号”%”,因为它表示换行的特殊意义,且第一个%后的所有字符串将当作命令的标准输入。

例如下面的定义:

  1. * * * * * /bin/cat >>/tmp/crond.txt %"the first %%cron entry%"

该任务输出的结果将是:

代码语言:javascript
复制
"the firstcron entry"

所以,在定时任务条目中若以时间定义文件名时,应当将%使用反斜杠转义。如:

代码语言:javascript
复制
* * * * * cp /etc/fstab /tmp/`date +\%Y-\%m-\%d`.txt

另外一个需要注意的时间段设置是,使用号问题。例如” */2 * * “,它表示每隔两小时后的每一分钟都执行任务,也就是凌晨0点的每分钟执行任务,凌晨1点不执行任务,凌晨2点的每分钟执行任务,凌晨4点的每分钟执行任务,依此类推。同理,”/5 */2 * * *”表示每隔2小时后的每5分钟执行一次任务。

二.crondtab file

rondtab file为任务定义文件。

(1).在此文件中,空行会被忽略,首个非空白字符且以#开头的行为注释行,但#不能出现在行中。

(2).可以在crontab file中设置环境变量,方式为”name=value”,等号两边的空格可随意,即”name = value”也是允许的。但value中出现的空格必须使用引号包围。

(3). 默认crond命令启动的时候会初始化所有变量,除了某几个变量会被crond daemon自动设置好,其他所有变量都被设置为空值。自动设置的变量包括SHELL=/bin/sh,以及HOME和LOGNAME(在CentOS上则称为USER),后两者将被默认设置为/etc/passwd中指定的值。其中SHELL和HOME可以被crontab file中自定义的变量覆盖,但LOGNAME不允许覆盖。当然,自行定义的变量也会被加载到内存。

(4).除了LOGNAME/HOME/SHELL变量之外,如果设置了发送邮件,则crond还会寻找MAILTO变量。如果设置了MAILTO,则邮件将发送给此变量指定的地址,如果MAILTO定义的值为空(MAILTO=””),将不发送邮件,其他所有情况邮件都会发送给crontab file的所有者。

(5).在系统定时任务文件/etc/crontab中,默认已定义PATH环境变量和SHELL环境变量,其中PATH=/sbin:/bin:/usr/sbin:/usr/bin。

(6).crond daemon每分钟检测一次crontab file看是否有任务计划条目需要执行。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.简介
  • 二.crondtab file
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档