前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >100个 Linux 命令(9)-计划任务

100个 Linux 命令(9)-计划任务

原创
作者头像
懒人的小脑
修改2019-01-17 16:04:04
1.3K0
修改2019-01-17 16:04:04
举报

这是100个 Linux 命令的第76个命令,关于如何编写计划任务条目。

crond 和 crontab、crond file

crond 是一个daemon 类进程,路径为/usr/sbin/crond。默认会以后台方式启动,service 或 systemd 方式启动 crond 默认也是后台方式。

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

crontab 是管理 crond file 的工具

选项

说明

-l

列出定时任务条目

-r

删除当前任务列表中断所有任务条目

-i

删除条目时提示是否要删除

-e

编辑定时任务文件,实际上编辑的是/var/spool/cron/*文件

-u

操作指定用户的定时任务

如:

代码语言:javascript
复制
crondtab -e #编辑当前用户位于 /var/spool/cron 下的 crond file
* * * * * /bin/echo "the first cron entry" >> /tmp/crond.txt

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

定义计划任务

定义计划的方法在/etc/crontab 文件中,此文件中定义了三个变量:PATH、SHELL、MALLTO

任务条目的定义方法
任务条目的定义方法

每个任务条目分为6段,每段以空格分隔,之所以这里会显示 user-name 是因为/etc/crontab 是系统定时任务文件,一般的定时任务没有该段。

前5段用于设定时间(执行频率),分别表示每分钟、每小时、每天、每月、每星期几。

“*”表示从每个时间段的开始到结束。例如在小时上设置*,表示0,1,2,3...22,23的意思。

每个时间段,都可以使用逗号“,”表示枚举,如“0,30,50 * * * *”表示每个小时的整点、第30分钟、第50分钟都指定该任务。

每个时间段,都可以使用“-”定义范围,可以结合逗号使用,如“00,20-30,50”表示每个小时的整点,20-30分钟的每分钟,第50分钟都执行指定任务。

每个时间段,使用“/”表示忽略时间,如在小时段定义了“0-13/2”表示在"0/2/4/6/8/10/12"点才满足时间定义。

常使用"*/N"表示每隔多久的意思。例如"00 */2 * * *"表示在每天每隔两小时的整点执行该任务(严格地说是0-23/2,也就是0,2,4,...,22,所以凌晨1点不会执行任务)。

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

命令段(即第6段)中,不能随意出现百分号"%",因为它表示换行的特殊意义,且第一个%后的所有字符串将当作命令的标准输入。在定时任务条目中若以时间定义文件名时,应当将%使用反斜杠转义。如:

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

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

crondtab file

crondtab file 是任务的定义文件。

  1. 在此文件中,空行会被忽略,首个非空白字符且以#开头的行是注释行,但#不能出现在行中;
  2. 可以在 crontab file 中设置环境变量,方式为"name=value",等号两边的空格可随意,即"name = value"也是允许的。但value中出现的空格必须使用引号包围;
  3. 默认 crond 命令启动时会初始化所有变量,除了某几个变量会被 crond daemon 自动设置好,其他所有的变量都被设置为控制。自动设置的变量包括 SHELL、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看是否有任务计划条目需要执行。

crond 命令的调试

crond 默认在后台运行,任务执行成功与否不会提示,可以让 crond 运行在前端进行调试。再次说明的是,crond守护进程是与终端无关的。

一般用法:crond [-n] [-P] [-x flags]

选项

说明

-n

让 crond 以前端方式运行

-P

不重设环境变量 PATH,而是从父进程中继承

-x

设置调事项,flags 是调试方式 “-x test”:调试不会真正执行 “-x sch”:调试显示调试信息,可以看到等待时间 “-x test,sch”

在sch调试结果中的等待时间是crond这个daemon的检测时间,所以它表示等待下一次检测的时间,因此除了第一次,之后每次都是60秒,因为默认crond是每分钟检测一次crontab file的。这样在调试定时任务时间时,也不会真正执行命令。

参考链接:http://www.cnblogs.com/f-ck-need-u/p/7059418.html

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • crond 和 crontab、crond file
  • 定义计划任务
  • crondtab file
  • crond 命令的调试
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档