前言

本文是视频教程韩顺平 一周学会Linux部分章节的归纳总结,内容补充和错误纠正。

概述

Linux中的任务调度是指在特定的时间或条件下执行预定的任务。crondat都是Linux中用于任务调度的工具。crond可以周期性地执行任务,而at则可以在指定的时间点执行任务。它们都可以帮助用户在特定的时间或条件下自动执行预定的任务,提高工作效率。

crond

简要介绍

crond是Linux系统中的一个守护进程,负责周期性地执行预定的任务。它根据预设的时间表(通常是crontab文件)来触发任务的执行。crontab文件包含了一系列的任务定义,每个任务定义包括了任务的执行时间、执行的命令或脚本等信息。crond会根据这些定义,按照设定的时间间隔周期性地执行任务。常见的时间间隔包括每分钟、每小时、每天、每周、每月等。

需要注意的是,at命令在某些系统上可能未预装(本人使用的Ubuntu 22.04未预装),可能需要通过包管理器安装。

基本语法

corntab [选项]:选项如下

选项 说明
-e 编辑corntab文件
-l 查询corntab定时任务调度
-r 递归删除corntab定时任务调度

编辑crontab文件的格式:分 时 日 月 周 要执行的命令或脚本

定时规则

其中的分 时 日 月 周cron的定时规则,也称为【cron表达式】,它还支持一些特殊字符和符号,例如通配符(*)、范围(-)、逗号(,)、间隔(/)等,以提供更灵活的调度选项。

示例

这么说可能有点抽象,让我们看看下面具体的crontab文件示例说明:

  1. 10 18 * * * ls /root/cat >> /home/user/watch.log:每天18点10分执行ls /root/cat >> /home/user/watch.log命令
  2. * 18 8 1 * ls /root/cat >> /home/user/watch.log:每年1月8日的18点执行ls /root/cat >> /home/user/watch.log命令
  3. 0 9 * * 1-5 /home/myshell.sh:每周一到周五的9点执行/home/myshell.sh脚本
  4. 0 9 * * 1,5 /home/myshell.sh:每周一和每周五的9点执行/home/myshell.sh脚本
  5. */5 * * * * ls /root/cat >> /home/user/watch.log:每隔5分钟执行ls /root/cat >> /home/user/watch.log命令

at

简要介绍

at是另一个任务调度工具,它允许用户在指定的时间执行一次性的任务。与crond不同,at不会周期性地执行任务,而是在指定的时间点执行一次任务。用户可以使用at命令来创建任务,并指定任务的执行时间和要执行的命令或脚本。at命令可以接受多种时间格式,如绝对时间、相对时间等。

atdat守护进程)是一个后台进程,负责管理at命令提交的任务。atd进程会根据系统时间和任务的执行时间进行调度,并将任务分配给合适的执行环境。

默认情况下,atd守护进程每60秒检测作业队列,如果存在作业时间并且当前时间匹配,则运行

基本语法

在执行at命令前,我们得先确认atd守护进程是否在运行中:

  • ps -ef | gerp atd:查看活跃进程,后面接上管道命令过滤出atd线程

确定atd线程开启后,我们可以使用at命令了,下面是at命令的说明

  • at [选项] [时间]:具体选项说明如下表
选项 说明
-m 指定任务执行完成后,通过邮件通知任务的所有者。
-l 列出待执行的任务列表。
-r 删除指定的任务。
-q 队列 指定任务队列的名称。
-t 时间 指定任务的执行时间。
-f 文件 指定要执行的命令或脚本文件。
-I 忽略任务执行时的标准输入。
-V 显示at命令的版本信息。
-c 显示任务的命令行内容。

输入完at命令后就可以进入编辑状态,在此界面输入执行的命令或脚本,使用Ctrl+D退出

  • atq:可以查看队列中未执行的定时任务信息,包括任务编号
  • atrm 任务编号:移除指定编号的定时任务

定时规则

crontab的定时规则不一样,at有很多种的定时规则:

时间规则 说明
绝对时间 使用24小时制的绝对时间来指定任务的执行时间。例如,at 12:30表示任务将在当天的12:30执行。
相对时间 使用相对时间来指定任务的执行时间。相对时间可以是当前时间的偏移量。例如,at now + 1 hour表示任务将在当前时间的1小时后执行。时间单位还有:daysminutesweeks
特定日期和时间 指定具体的日期和时间来执行任务。例如,at 2023-07-04 09:00表示任务将在2023年7月4日的9:00执行。
关键字 at指令支持一些关键字来指定特定的时间点,例如midnight(午夜)、noon(中午)和teatime(下午4点)。例如,at midnight表示任务将在每天的午夜执行。today,tomorrow也是可以的。
时间表达式 使用时间表达式来指定更复杂的时间规则。时间表达式使用特定的语法来描述任务的执行时间。例如,at 10:00pm + 2 days表示任务将在两天后的晚上10点执行。

示例

  1. 在晚上10点执行位于/path/to/script.sh的脚本。

    1
    2
    3
    $at 10:00 PM
    at> /path/to/script.sh
    at> Ctrl+D
  2. 在当前时间的1小时后执行命令,将”Hello, world!”写入到/path/to/output.txt文件中

    1
    2
    3
    $at now + 1 hour
    at> echo "Hello, world!" > /path/to/output.txt
    at> Ctrl+D