Linux讲解之定时任务

本文目录:

12.1 配置定时任务

12.2 crontab file

12.3 crond命令的调试

12.4 精确到秒的任务计划

12.1 配置定时任务

首先需弄清的概念:

(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命令:

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

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

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

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

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

[root@server2 ~]# cat /etc/crontabSHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=root # For details see man 4 crontabs # 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# |  |  |  |  |# *  *  *  *  * user-name  command to be executed

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

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

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

(3).在时间定义段中,使用”*”表示每单位,即每分钟,每小时,每天,每月,每周几(仍然是每天)。

(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 * * *”表示在每天每隔两小时的整点执行该任务。

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

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

例如下面的定义:

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

该任务输出的结果将是:

"the firstcron entry"

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

* * * * * cp /etc/fstab /tmp/`date +\%Y-\%m-\%d`.txt

另外一个需要注意的时间段设置是,使用*号导致低级别的时间覆盖高级别的时间。例如”* */2 * * *”,它不表示每两小时执行一次任务,而是每分钟执行一次,尽管在小时位上设置了每隔两小时,但在分钟位上设置的是每分钟,所以它仍然表示每分钟执行一次任务。同理,”*/5 */2 * * *”分钟位上的设置覆盖小时位上的设置,表示每5分钟执行一次而忽略小时位的设置;”00 */2 */5 * *”表示每隔两小时的整点执行一次任务而忽略天数位的设置。

12.2 crondtab file

crondtab 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看是否有任务计划条目需要执行。

12.3 crond命令的调试

很多时候写了定时任务却发现没有执行,或者执行失败,但因为crond是后台运行的,有没有任何提示,很难进行排错。但是可以让crond运行在前端并进行调试的。

先说明下任务计划程序crond的默认执行方式。

使用下面三条命令启动的crond都是在后台运行的,且都不依赖于终端。

[root@xuexi ~]# systemctl start crond.service[root@xuexi ~]# service crond start[root@xuexi ~]# crond

但crond是允许接受选项的。

crond [-n] [-P] [-x flags]选项说明:-n:让crond以前端方式运行,即不依赖于终端。-P:不重设环境变量PATH,而是从父进程中继承。-x:设置调试项,flags是调试方式,比较有用的方式是test和sch,即"-x test"和"-x sch"。  :其中test调试将不会真正的执行,sch调试将可以看到等待时间。具体的见下面的示例。

先看看启动脚本启动crond的方式。

[root@server2 ~]# cat /lib/systemd/system/crond.service[Unit]Description=Command SchedulerAfter=auditd.service systemd-user-sessions.service time-sync.target [Service]EnvironmentFile=/etc/sysconfig/crondExecStart=/usr/sbin/crond -n $CRONDARGSExecReload=/bin/kill -HUP $MAINPIDKillMode=process[Install]WantedBy=multi-user.target

它的环境配置文件为/etc/sysconfig/crond,该文件中什么也没设置。

[root@server2 ~]# cat /etc/sysconfig/crond# Settings for the CRON daemon.# CRONDARGS= :  any extra command-line startup arguments for crondCRONDARGS=

所有它的启动命令为:/usr/sbin/crond -n。但尽管此处加了”-n”选项,crond也不会前端运行,且不会依赖于终端,这是systemctl决定的。

在解释下如何进行调试。以下面的任务条目为例。

[root@server2 ~]# crontab -e* * * * * echo "hello world" >>/tmp/hello.txt

执行crond并带上调试选项test。

[root@server2 ~]# crond -x testdebug flags enabled: test[4903] cron startedlog_it: (CRON 4903) INFO (RANDOM_DELAY will be scaled with factor 8% if used.)log_it: (CRON 4903) INFO (running with inotify support)log_it: (CRON 4903) INFO (@reboot jobs will be run at computer's startup.)log_it: (root 4905) CMD (echo "hello world" >>/tmp/hello.txt )

执行crond并带上调试选项sch。

[root@server2 ~]# crond -x schdebug flags enabled: sch[4829] cron startedlog_it: (CRON 4829) INFO (RANDOM_DELAY will be scaled with factor 73% if used.)log_it: (CRON 4829) INFO (running with inotify support)[4829] GMToff=28800log_it: (CRON 4829) INFO (@reboot jobs will be run at computer's startup.)[4829] Target time=1497950880, sec-to-wait=38      # 等待crond daemon下一次的检测,所以表示38秒后crond将检测crontab fileuser [root:0:0:...] cmd="echo "hello world" >>/tmp/hello.txt "[4829] Target time=1497950940, sec-to-wait=60Minute-ly job. Recording time 1497922081log_it: (root 4831) CMD (echo "hello world" >>/tmp/hello.txt )user [root:0:0:...] cmd="echo "hello world" >>/tmp/hello.txt "[4829] Target time=1497951000, sec-to-wait=60Minute-ly job. Recording time 1497922141log_it: (root 4833) CMD (echo "hello world" >>/tmp/hello.txt )

但要注意,在sch调试结果中的等待时间是crond这个daemon的检测时间,所以它表示等待下一次检测的时间,因此除了第一次,之后每次都是60秒,因为默认crond是每分钟检测一次crontab file的。例如,下面是某次的等待结果,在这几次等待检测过程中没有执行任何任务。

[4937] Target time=1497951720, sec-to-wait=18[4937] Target time=1497951780, sec-to-wait=60[4937] Target time=1497951840, sec-to-wait=60

还可以同时带多个调试方式,如:

[root@server2 ~]# crond -x test,schdebug flags enabled: sch test[4914] cron startedlog_it: (CRON 4914) INFO (RANDOM_DELAY will be scaled with factor 21% if used.)log_it: (CRON 4914) INFO (running with inotify support)[4914] GMToff=28800log_it: (CRON 4914) INFO (@reboot jobs will be run at computer's startup.)[4914] Target time=1497951540, sec-to-wait=9user [root:0:0:...] cmd="echo "hello world" >>/tmp/hello.txt "[4914] Target time=1497951600, sec-to-wait=60Minute-ly job. Recording time 1497922741log_it: (root 4916) CMD (echo "hello world" >>/tmp/hello.txt )

这样在调试定时任务时间时,也不会真正执行命令。

12.4 精确到秒的任务计划

默认情况下,crond执行的任务只能精确到分钟,无法精确到秒。但通过技巧,也是能实现秒级任务的。

(1).方法一:不太精确的方法

写一个脚本,在脚本中sleep3秒钟的时间,这样能实现每3秒执行一次命令。

[root@xuexi ~]# cat /tmp/a.sh#!/bin/bash#PATH="$PATH:/usr/local/bin:/usr/local/sbin"for ((i=1;i<=20;i++));dols /tmpsleep 3done

[root@xuexi ~]# cat /var/spool/cron/lisi* * * * * /bin/bash /tmp/a.sh

但是这样的方法不是最佳方法,因为执行命令也需要时间,且crond默认会有一个随机延时,随机延时由变量RANDOM_DELAY定义。

(2).方法二:在cron配置文件中写入多条sleep命令和其他命令。

[root@xuexi ~]# cat /var/spool/cron/lisi* * * * * ls /tmp* * * * * sleep 3 && ls /tmp* * * * * sleep 6 && ls /tmp* * * * * sleep 9 && ls /tmp* * * * * sleep 12 && ls /tmp* * * * * sleep 15 && ls /tmp* * * * * sleep 18 && ls /tmp* * * * * sleep 21 && ls /tmp* * * * * sleep 24 && ls /tmp* * * * * sleep 27 && ls /tmp* * * * * sleep 30 && ls /tmp…* * * * * sleep 57 && ls /tmp

这种方式很繁琐,但是更精确。如果定义到每秒级别就得写60行cron记录。

由此能看出,秒级的任务本就不是crond所擅长的。实际上能用到秒级的任务也比较少。

以上就是Linux讲解之定时任务的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/187135.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月1日 11:26:38
下一篇 2025年11月1日 11:30:40

相关推荐

  • 《坦克世界》侦查任务2024:尝试局部天气!

    风聚云涌,山雨欲来。天有不测风云,星星之火亦可以成为燎原之势头——很快,您就可以在《坦克世界》的全新侦查任务中,将这一切转换为您的优势。随机事件开启了地图于玩家互动的传奇,而局部天气将续写新篇章! 开始时间:2024年11月04日 结束时间:2024年11月17日 黄金时间:14:00 &#8211…

    2025年12月2日 行业动态
    000
  • 通过实例讲解mysql如何实现定时任务

    自mysql5.1.6起,增加了一个非常有特色的功能-事件调度器(event scheduler),可以用做定时执行某些特定任务(例如:删除记录、对数据进行汇总、数据备份等等),来取代原先只能由操作系统的计划任务来执行的工作。 更值得一提的是MySQL的事件调度器可以精确到每秒钟执行一个任务,而操作…

    2025年12月2日 数据库
    000
  • MySQL和Shell脚本:如何实现定时数据清理功能

    mysql和shell脚本:如何实现定时数据清理功能 概述:在开发和维护数据库应用程序时,经常需要定期清理数据库中的过期或无用数据。这些数据的积累不仅会占用数据库的存储空间,还会影响数据库的查询性能。本文将介绍如何通过MySQL和Shell脚本实现定时数据清理功能。 创建清理脚本首先,我们需要创建一…

    数据库 2025年11月25日
    000
  • USB:首个将视觉、语言和音频分类任务进行统一的半监督分类学习基准

    当前,半监督学习的发展如火如荼。但是现有的半监督学习基准大多局限于计算机视觉分类任务,排除了对自然语言处理、音频处理等分类任务的一致和多样化评估。此外,大部分半监督论文由大型机构发表,学术界的实验室往往由于计算资源的限制而很难参与到推动该领域的发展中。 为此,微软亚洲研究院的研究员们联合西湖大学、东…

    2025年11月10日 科技
    000
  • ChatGPT喜欢的秘密提示(附证据)

    本文转载自微信公众号「数据派THU」,作者数据派THU。转载本文请联系数据派THU 公众号。 翻译:陈超 校对:赵茹萱 获得只有 当您仅对以下四个问题回答“是”时,再阅读此博客文章。 1.您同意ChatGPT是一个极其有力的工具,每个人都可以使用?是/否 2.您是否同意越来越多的生成式 AI 应用程…

    2025年11月10日 科技
    000
  • 任务管理器被禁用怎么解除? Windows解除禁用任务管理器的技巧

    你的电脑任务管理器无法正常使用了?这会严重影响你对系统资源的监控和管理,甚至可能导致一些软件无法正常运行,让你束手无策。 也许是病毒感染,也许是误操作,总之,一个被禁用的任务管理器会让你的电脑体验大打折扣。 你是否尝试过各种方法却依然无法解决这个问题?别担心!php小编百草将带你逐步了解如何在win…

    2025年11月9日 系统教程
    100
  • HuggingGPT:处理AI任务的神奇工具

    简介 人工通用智能(agi)可以被认为是一个人工智能系统,它能够像人类一样理解、处理和响应智力任务。这是一项具有挑战性的任务,需要深入了解人脑的工作方式,以便我们能够复制它。然而,chatgpt的出现引起了研究界对开发此类系统的巨大兴趣。微软已经发布了这样一个由ai驱动的关键系统,名为hugging…

    2025年11月9日 科技
    000
  • JetBrains 发布 Junie AI 编程智能体 可执行编写调试等多步任务

    近日,jetbrains 正式宣布,其 ai 编程智能体 junie ai 已达到 ” 生产就绪 ” ( production-ready ) 状态。这意味着 junie ai 已经具备执行编写代码、调试运行等多步骤任务的能力,为开发者提供强大的 ai 支持。与此同时,jet…

    2025年11月8日 硬件教程
    000
  • 无限暖暖且寄浮生梦任务 与单品灵拍照怎么做攻略

    在《无限暖暖》中,玩家将扮演搭配师暖暖,与大喵携手开启一段全新的冒险旅程。在广阔的奇迹大陆上,你可以通过多种方式收集风格各异的精美套装,其中部分套装还拥有特殊的功能效果。那么在丹青季活动中,如何完成与“单品灵拍照”的任务呢?别担心,以下是详细的完成方法,一起来看看吧~ 提示:只需与绒花、香包或团扇中…

    2025年11月4日 游戏教程
    000

发表回复

登录后才能评论
关注微信