「crontab」- 周期任务的配置文件 @20210308
配置文件crontab中描述了需要命令cron周期执行的任务。
配置文件的位置
系统级别的配置文件为/etc/crontab。通常由系统管理员编辑,执行系统维护相关的周期任务。
用户级别的配置文件位于/var/spool/cron/crontabs/中。每个用户在该目录中都有自己的crontab文件,单独存放。使用命令crontab(1)进行编辑。这其中任何给定的crontab中的命令都将使用拥有crontab文件的用户身份来执行。
文件内容概述
文件crontab中包含了cron(8)守护程序的指令,一般形式为:``此日期此时运行此命令''。
Uucp和News通常都有自己的crontabs,因此无需显式运行su(1)作为cron命令的一部分。
配置文件的内容分为第三部分:
* 注释行;* 环境变量设置;* 周期任务指定;
下面将分别介绍这三部分。
配置中使用注释
空白行会被忽略;前导的空格和TAB也会被忽略;以井号(#)开始的行会被忽略。
注意事项
注释不允许和命令在同一行。就是说一行条目,要么是命令,要么是注释。下面的格式是不正确的:
09,39 * * * * root date >> /var/log/date # comment...
同样的,注释也不能和环境变量设置在同一行。
配置文件中的环境变量
文件crontab中可以指定命令执行的环境变量。
文件crontab从上到下进行解析,因此任何环境变量设置都只会影响文件中它们下面的cron命令。环境变量设置的形式:
name = value
等号(=)周围的空格是可选的,value中任何后续的非前导空格都是分配给name的值的一部分。value字符串可以放在引号中(单引号或双引号,但要成对出现)以保留前导或尾随空白。要定义空变量,必须使用引号。对于环境替换、变量替换都不会进行不解析,因此类似:
PATH = $HOME/bin:$PATH
的行不会按照你的期望进行解析。下面的这些也不会奏效:
A=1 B=2 C=$A $B
在最后一个值C中,不会替换定义的变量,因此C就是字面上的“$A $B”。
设置命令路径PATH的另一种方法是:即许多shell会将代字号(~)视为$HOME的代替,因此如果您将BASH用于任务,则可以使用:
SHELL=/bin/bash PATH=~/bin:/usr/bin/:/bin
守护进程cron(8)自动设置了几个环境变量。SHELL设置为/bin/sh;LOGNAME和HOME是从文件crontab的所有者的/etc/passwd行设置的。PATH设置为“/usr/bin:/bin”。HOME、SHELL、PATH可能会被crontab文件中的设置覆盖;LOGNAME是作业运行的用户,可能不会更改。
另一个注意事项:LOGNAME变量有时在BSD系统上称为USER ......在这些系统上,也会设置USER。
除了LOGNAME、HOME、SHELL之外,如果由于在“当前”的crontab文件中运行命令而有任何理由发送邮件,则cron(8)将查找MAILTO。如果定义了MAILTO(并且非空),则将邮件发送给如此命名的用户。MAILTO还可用于通过用使用“逗号分隔收件人用户”的形式来将邮件发送到多个收件人。如果MAILTO已定义但为空(MAILTO=""),则不会发送任何邮件。否则,邮件将发送给crontab的所有者。
在Debian GNU/Linux系统上,cron支持pam_env模块,并加载/etc/environment和/etc/security/pam_env.conf指定的环境。它还从/etc/default/locale读取区域设置信息。但是,PAM设置不会覆盖上述设置,也不会覆盖crontab文件本身的任何设置。请特别注意,如果您想要“/usr/bin:/bin”以外的PATH,则需要在crontab文件中进行设置。
邮件发送
默认情况下,cron将使用“text/plain”的邮件“Content-Type:”标题发送邮件,并将“charset=”参数设置为启动crond(8)的语言环境的charmap/codeset(即默认系统区域设置),如果未设置LC_*环境变量,或LC_ *环境变量指定的区域设置(请参阅locale(7))。通过设置crontabs中的CONTENT_TYPE和CONTENT_TRANSFER_ENCODING变量来纠正邮件头的值,以此来对邮寄的cron作业输出使用不同的字符编码。
周期任务的定义指令
命令cron的格式非常符合V7标准,具有许多向上兼容的扩展。每行有五个时间日期字段,后跟一个命令,后跟一个换行符('\n')。系统crontab(/etc/crontab)使用相同的格式,除了在时间日期字段之后以及命令之前有一个指定执行命令的用户。因此由以下两种形式:
* * * * * command * * * * * username command
字段之间可以使用空格(SPACE)或者制表符(TAB)进行分隔。
命令command允许的最大长度为998个字符。
当分钟、小时、月份字段与当前时间匹配时,以及当两个“天字段”(月中某天、星期几)中的至少一个与当前时间匹配时,命令由cron(8)执行(参阅下面的“注意事项”部分)。cron(8)每分钟检查一次cron条目。时间和日期字段是:
field allowed values ----- -------------- minute 0-59 hour 0-23 day of month 1-31 month 1-12 (or names, see below) day of week 0-7 (0 or 7 is Sun, or use names)
字段可以是星号(*),它总是代表“first-last”(从开始到最后)。
允许使用「数字范围」。「数字范围」是用连字符(-)分隔的两个数字。指定的范围包括在内。例如,“hour”条目的“8-11”表示在8,9,10,11小时执行。
允许使用「列表」。「列表」是由逗号分隔的一组数字(或数字范围)。例如1,2,5,9和0-4,8-12这两种。
「范围」可与「步长」结合使用。在「范围」之后跟有“/<number>”表示在该范围内跳过数字的值。例如,可以在小时字段中使用“0-23/2”来指定每隔一小时执行一次命令(V7标准中的替代方法是“0,2,4,6,8,10,12,14,16,18,20,22)。星号后也允许使用步长,所以如果你想说“每两个小时“,只需使用“*/2”。
“日期名称”也可用于“月份”和“星期几”字段。“日期名称”是指特定日期或月份的前三个字母(大小写无关紧要)。“日期名称”不允许使用范围或列表。
第“六”字段(行的其余部分)指定要运行的命令。该行的整个命令部分,直到换行符(LF)或百分号(%)字符,将由/bin/sh或crontab文件的SHELL变量中指定的Shell执行。除非使用反斜杠(\)进行转义,否则命令中的百分号(%)将更改为换行符,并且第一个%之后的所有数据将作为标准输入发送到命令。无法将单个命令行拆分为多行,例如Shell的尾部“\”是不行的。
注意:命令执行的日期可以由两个字段指定:月中的某天;星期几。如果两个字段都受到限制(即,不以*开头),则当任一字段与当前时间匹配时,将运行该命令。例如,“30 4 1,15 * 5”将导致命令在每个月的1号和15号凌晨4:30,以及每个星期五运行。但是,可以通过向命令添加测试(test)来实现所需的结果(请参阅下面的「配置示例」部分的最后一个示例)。
可能会出现以下八个特殊字符串中的一个,而不是前五个字段:
string meaning ------ ------- @reboot Run once, at startup. @yearly Run once a year, "0 0 1 1 *". @annually (same as @yearly) @monthly Run once a month, "0 0 1 * *". @weekly Run once a week, "0 0 * * 0". @daily Run once a day, "0 0 * * *". @midnight (same as @daily) @hourly Run once an hour, "0 * * * *".
请注意,就@reboot而言,启动是cron(8)守护进程启动的时刻。特别是,可能在某些系统守护程序或其他工具启动之前。这是由于机器的引导顺序。
注意事项
cron要求crontab中的每个条目以换行符(LF)结尾。如果crontab中的最后一个条目缺少换行符(即由EOF终止),则cron会认为crontab(至少部分地)已损坏。警告将写入syslog中。
存在的差异性
在指定星期几时,第0天和第7天都将被视为星期日。但是BSD和AT&T似乎对此持不同意见。
列表和范围允许在同一字段中共存。“1-3,7-9”的形式将被AT&T或BSD的cron拒绝(他们只支持“1-3”或“7,8,9”,不能)。
“日期范围”可以包括“步长”,因此“1-9/2”与“1,3,5,7,9”相同。
可以通过“日期名称”的形式指定一周中的几个月或几天。
可以在文件crontab中设置环境变量。在BSD或AT&T中,传递给子进程的环境基本上是来自/etc/rc的环境。
命令输出会邮件给crontab所有者(BSD无法执行此操作),可以邮寄给crontab所有者以外的人(SysV无法执行此操作),或者可以关闭该功能并且完全不会发送邮件(SysV也不能这样做)。
可以代替前五个字段出现的所有`@'命令都是扩展名。
存在的限制
守护程序cron以定义的时区运行。它目前不支持基于每个用户的时区设置。所有任务:系统和用户将根据配置的时区运行。即使用户在其crontab中指定了TZ环境变量,这也只会影响crontab中执行的命令,而不会影响crontab任务本身的执行。
POSIX指定:如果日期和星期字段其中任何一个为“*”,则日期和星期字段都需要与当前时间匹配。但是,此实现仅检查第一个字符是否为“*”。这就是“0 0 */2 * sun”每周日运行的原因,这是一个奇数日期,而POSIX标准将在每个星期日和每个奇数日期运行。
crontab语法无法定义可以想象的所有可能的时间段。例如,定义一个月的最后一个工作日并不简单。要在无法使用crontab语法定义的时间段内运行任务,最好的方法是让程序本身检查日期和时间信息,并仅在周期与所需周期匹配时继续执行。
如果程序本身无法进行检查,则需要包装脚本。可用于日期分析的有用工具是ncal或calendar。例如,要在每个月的最后一个星期六运行程序,您可以使用以下包装器代码:
0 4 * * Sat [ "$(date +\%e)" = "$(LANG=C ncal | sed -n 's/^Sa .* \([0-9]\+\) *$/\1/p')" ] && echo "Last Saturday" && program_to_run
复杂的需求通常需要与脚本配合才能实现。
配置示例
用户级配置文件示例
以下列出了用户crontab文件的示例:
# use /bin/bash to run commands, instead of the default /bin/sh SHELL=/bin/bash# mail any output to `paul', no matter whose crontab this is MAILTO=paul# # run five minutes after midnight, every day 5 0 * * * $HOME/bin/daily.job >> $HOME/tmp/out 2>&1# run at 2:15pm on the first of every month -- output mailed to paul 15 14 1 * * $HOME/bin/monthly# run at 10 pm on weekdays, annoy Joe 0 22 * * 1-5 mail -s "It's 10pm" joe%Joe,%%Where are your kids?% 23 0-23/2 * * * echo "run 23 minutes after midn, 2am, 4am ..., everyday" 5 4 * * sun echo "run at 5 after 4 every Sunday" 0 */4 1 * mon echo "run every 4th hour on the 1st and on every Monday" 0 0 */2 * sun echo "run at midn on every Sunday that's an uneven date"# Run on every second Saturday of the month 0 4 8-14 * * test $(date +\%u) -eq 6 && echo "2nd Saturday"
以上所有示例都运行非交互式程序。如果您希望运行与用户桌面交互的程序,则必须确保设置了正确的环境变量DISPLAY:
# Execute a program and run a notification every day at 10:00 am 0 10 * * * $HOME/bin/program | DISPLAY=:0 notify-send "Program run" "$(cat)"
否则无法进行提示。
系统级配置文件示例
以下列出了常规系统范围的crontab文件的内容。与用户的crontab不同,此/etc/crontab文件具有用户名username字段:
# /etc/crontab: system-wide crontab # Unlike any other crontab you don't have to run the `crontab' # command to install the new version when you edit this file # and files in /etc/cron.d. These files also have username fields, # that none of the other crontabs do.SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin# Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # m h dom mon dow user command 17 * * * * root cd / && run-parts --report /etc/cron.hourly 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
请注意,默认情况下,所有系统范围的任务都将从早上6点运行到早上7点。对于在此期间未启动的系统,除非更改上述默认值,否则仅执行每小时任务。
相关文档
cron(8), crontab(1)
参考文献
man 5 crontab, version 3.0pl1-130
更新日志
04/23/2018 创建文章
08/17/2018 文章内容调整
「crontab」- 周期任务的配置文件 @20210308相关推荐
- crontab:周期任务的配置文件
永久地址:crontab:周期任务的配置文件(保存网址不迷路
- 「systemd」- 修改单元文件 @20210318
问题描述 系统安装某个服务,但是需要修改它的单元文件的参数. 由于这些服务是通过包管理器安装的,比如 YUM 安装,不建议直接修改包中的文件.因为随着软件的升级,该单元文件会被覆盖或者删除,因此不应该 ...
- 智驾差异化周期下的「芯」风向
随着中国市场进入智能驾驶「差异化」竞争周期,车企对于核心算力芯片的可选项,正在变得越来越多.一方面,车企在寻求更高性价比的替代(升级)方案:另一方面,多元化的需求(舱泊一体.行泊一体.驾舱一体)给了汽 ...
- 「Linux」- 运行任天堂红白机游戏(“小霸王”) @20210308
问题描述 # 02/16/2021 今天,闲来无事(其实也有事,就是累了,想休息一下),想再玩一玩这些小游戏,重温经典,所以就有了这篇文章,来记录这一过程.当我们不会去买一个红白机,虽然有卖的.我们想 ...
- 一个「菜鸟」转行AI的成长心得!
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:太子长琴,算法工程师 本文是一个转行四年的「菜鸟」的成长心得,围绕 ...
- 「干货」Snort使用手册「详细版」
也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 0x01 前言 1.1 IDS是什么? IDS(intrus ...
- 用 Electron 打造 Win/Mac 应用,从「代码」到可下载的「安装包」,可能比你想得麻烦一点...
首发于酷家乐前端博客,作者@摘星(segmentfault @StinsonZhao) 我们能从很多地方学习到怎么起一个 Electron 项目,有些还会介绍怎么打包或构建你的代码,但距离「真正地发行 ...
- 用 Electron 打造 Win/Mac 应用,从「代码」到可下载的「安装包」,可能比你想得麻烦一点... 1
2019独角兽企业重金招聘Python工程师标准>>> 首发于酷家乐前端博客 我们能从很多地方学习到怎么起一个 Electron 项目,有些还会介绍怎么打包或构建你的代码,但距离「真 ...
- 用 Electron 打造 Win/Mac 应用,从「代码」到可下载的「安装包」,可能比你想得麻烦一点
首发于酷家乐前端博客,作者@摘星(segmentfault @StinsonZhao) 我们能从很多地方学习到怎么起一个 Electron 项目,有些还会介绍怎么打包或构建你的代码,但距离「真正地发行 ...
最新文章
- LabVIEW图像灰度分析与变换(基础篇—4)
- 使用Wisdom RESTClient如何在Linux和Mac上获取测试报告和API文档?
- PHP7 学习笔记(八)JetBrains PhpStorm 2017.1 x64 MySQL数据库管理工具的使用
- python 读图片性能测试
- node+express+mongDB实现简单登录注册
- 图书 网管天下系列图书 之 网络管理工具实用详解 目录
- 基本数据结构 - 栈和队列
- 面向对象的三个特点:封装、继承、多态
- 路由重发布Route Redistribution
- STC学习:振动声光报警器
- Objective-C中ORM的运用:实体对象和字典的相互自动转换
- python遍历文件夹内文件并检索文件中的中文内容
- 计算机锁屏如何取消密码,Win10锁屏密码怎么取消?Win10系统取消锁屏密码的方法教程...
- 手机屏幕如何投屏到电脑上(Windows10)
- kali全版本镜像下载地址
- 你在用哪种编程字体?
- spring报MySQLSyntaxErrorException: Unknown error 1146
- 报错:ImportError: Cannot load backend ‘TkAgg‘ which requires the ‘tk‘ interactive
- 文件夹文件自动生成目录的方法-保存到txt
- 解决:‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件
热门文章
- 使用itextpdf编辑PDF制作电子合同
- Go测试开发(二) 多线程简单斗地主
- 小程序-一夜狼人杀-使用说明(新增酒鬼)
- python作品-python+作品
- HTML5期末大作业:淘宝网站设计——仿2021淘宝首页(1页) 大学生网页制作教程 表格布局网页模板 学生HTML静态水网页设计作业成品 简单网页制作代码 学生商城网页作品免费设计
- 2021年美容师(初级)考试总结及美容师(初级)试题及解析
- 团体天梯 L2-030 冰岛人 (25 分)(思路、测试点分析)
- 用于带式运输机上的传动及减速装置课程设计
- 存储解决方案公司招聘
- 【音视频】流媒体直播实时视频延迟时间排查和剖析:gop关键帧间隔导致延迟,流媒体和播放器缓存,B帧等导致的延迟