目录
一、一次性延迟任务:at 命令
核心功能
基本用法
时间格式(TIMESPEC)
作业管理
二、周期性用户作业:crontab
核心功能
时间格式详解
实战示例
常用管理命令
三、周期性系统作业:系统级 crontab
核心区别
存放位置
四、弥补错过的任务:Anacron
核心问题
工作原理
配置文件格式
五、现代替代方案:Systemd 定时器
核心优势
核心组件
实战示例:清理临时文件
总结:
一、一次性延迟任务:at 命令
核心功能
at 命令用于调度一次性的延迟任务,适合那些只需要在未来某个特定时间点执行一次的操作,例如系统维护、数据备份等。
基本用法
交互式输入:直接在终端输入 at <时间>,然后键入要执行的命令,按 Ctrl+D 结束。
脚本输入:通过重定向从脚本文件读取命令,例如 at now +5min < myscript.sh,将脚本中的任务调度到 5 分钟后执行。
时间格式(TIMESPEC)
at 支持非常灵活的自然语言时间格式:
具体时间:02:00pm, 15:59, midnight, teatime (16:00)
相对时间:now +5min, noon +4 days
具体日期:5pm august 3 2021
注意:如果只提供时间(如 21:00),则作业会在当天该时间执行;若当天时间已过,则顺延至次日。
作业管理
atq 或 at -l:查看当前用户的待处理作业列表。
at -c <作业编号>:查看作业的详细内容和运行环境。
atrm <作业编号>:从计划中删除指定作业。
权限:普通用户只能查看和控制自己的作业,root 用户可以管理所有作业。
二、周期性用户作业:crontab
核心功能
cron 是一个守护进程,负责执行配置文件中定义的周期性任务。每个用户都有自己的 crontab 文件,通过 crontab 命令进行管理。
时间格式详解
用户 crontab 文件的每一行代表一个作业,由 6 个字段 组成,空格分隔:(分时日月周)
| 1 | 分钟 | 0-59 |
| 2 | 小时 | 0-23 |
| 3 | 日 | 1-31 |
| 4 | 月 | 1-12 (或 Jan, Feb…) |
| 5 | 星期 | 0-7 (0 和 7 代表周日,1-6 代表周一到周六) |
| 6 | 命令 | 要执行的命令或脚本 |
前五个字段的语法规则:
*:表示 “每一个”,即该字段的所有可能值。
数字:指定具体值,如 5 表示第 5 分钟。
x-y:表示范围,包含 x 和 y,如 8-20 表示从 8 点到 20 点。
x,y:表示列表,可包含范围,如 5,10-13,17。
*/x:表示间隔,如 */2 表示每 2 分钟。
实战示例
一)需求:以当前用户身份,在工作日(周一至周五)的上午 8 点到晚上 9 点之间,每 2 分钟记录一次当前日期和时间。
# 编辑当前用户的 crontab
crontab -e
# 在打开的编辑器中添加以下行
*/2 8-20 * * 1-5 /bin/date >> /home/user/time_log.txt
逐行解释:
*/2:每 2 分钟执行一次。
8-20:在 8 点到 20 点(含)之间执行。
*:每月的每一天。
*:每年的每个月。
1-5:仅在周一到周五执行。
/bin/date >> /home/user/time_log.txt:执行 date 命令(使用绝对路径),并将输出追加到日志文件中。
二)编写 crontab 定时任务 1.确定时间表达式 结合需求,我们可以逐个确定 5 个时间字段的值: 分钟:每 2 分钟一次 → */2 小时:8 点到 21 点 → 8-20 (是到20:59不包括21) 日期:每月任意一天 → * 月份:每年任意一月 → * 星期:周一到周五 → 1-5 2. 确定执行命令 需求是输出当前日期和时间,Linux 中对应的命令是 date(绝对路径)。
which date
通常输出结果为 /usr/bin/date。同时,我们需要将输出结果追加到文件中(避免覆盖原有内容),使用重定向符号 >>,例如写入 /home/当前用户/time_log.txt 文件。 3. 完整的 crontab 任务代码
*/2 8-20 * * 1-5 /usr/bin/date >> /home/$(whoami)/time_log.txt
常用管理命令
crontab -l:列出当前用户的所有作业。
crontab -r:删除当前用户的所有作业。
crontab -e:编辑当前用户的作业。
三、周期性系统作业:系统级 crontab
核心区别
用户 crontab 是为个人任务设计的,而系统级 crontab 则用于维护整个系统的正常运行,如日志轮转、缓存清理等。
存放位置
自定义的周期性系统作业,应始终在 /etc/cron.d/ 目录下创建独立的 crontab 文件。这样做的好处是:
与用户作业隔离,便于管理。
不会被未来的系统更新覆盖。
可以更精细地控制作业的执行用户。
系统级 crontab 格式:系统级文件比用户文件多一个字段,用于指定执行作业的用户:
分钟 小时 日 月 星期 用户名 要执行的命令
此外,系统还提供了一些预设的目录:
/etc/cron.hourly/:每小时执行的脚本。
/etc/cron.daily/:每天执行的脚本。
/etc/cron.weekly/:每周执行的脚本。
/etc/cron.monthly/:每月执行的脚本。只需将脚本放入这些目录,cron 就会自动按周期执行。
四、弥补错过的任务:Anacron
核心问题
cron 依赖系统持续运行。如果系统在任务计划执行时处于关闭或休眠状态,任务就会被错过。anacron 正是为了解决这个问题而设计的。
工作原理
anacron 根据 /etc/anacrontab 配置文件运行每日、每周和每月的作业。它通过 /var/spool/anacron/ 目录下的时间戳文件来记录作业上次执行的时间。当系统启动时,anacron 会检查这些时间戳,如果发现有作业错过了执行时间,就会在系统空闲时立即补执行。
配置文件格式
/etc/anacrontab 中的每一行包含四个字段:
周期(天数):定义作业的执行频率,如 1 表示每日,7 表示每周。
延迟(分钟):系统启动后,等待多久再开始执行作业,以避免系统刚启动时负载过高。
作业标识符:用于在日志中标识该作业。
命令:要执行的命令或脚本。
五、现代替代方案:Systemd 定时器
核心优势
随着 systemd 成为大多数现代 Linux 发行版的初始化系统,systemd 定时器作为 cron 的现代替代方案,提供了更强大、更灵活的定时功能,例如:
更精确的事件触发(如系统启动后、文件更改时)。
与 systemd 服务单元深度集成,便于管理和监控。
支持更复杂的依赖关系和资源控制。
核心组件
一个 systemd 定时器由两个文件组成:
定时器单元(.timer):定义何时触发任务。
服务单元(.service):定义要执行的任务本身。
实战示例:清理临时文件
系统自带的 systemd-tmpfiles-clean.timer 就是一个典型例子,它会定期清理 /tmp 等目录中的过期文件。
定时器配置(/usr/lib/systemd/system/systemd-tmpfiles-clean.timer):
[Unit]
Description=Daily Cleanup of Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)
ConditionPathExists=!/etc/initrd-release
[Timer]
OnBootSec=15min
OnUnitActiveSec=1d
[Install]
WantedBy=sysstat.target
关键配置项:
OnBootSec=15min:系统启动 15 分钟后触发一次。
OnUnitActiveSec=1d:服务单元上次激活后,间隔 1 天再次触发。
管理命令:
systemctl list-timers:查看所有活动的定时器。
systemctl daemon-reload:修改配置文件后,重新加载 systemd 配置。
总结:
表格
| at | 一次性延迟任务 | 简单直观,支持自然语言时间 | 不支持周期性任务 |
| cron (用户) | 个人周期性自动化 | 配置简单,用户隔离 | 依赖系统运行,错过不补 |
| cron (系统) | 系统级周期性维护 | 功能强大,适合复杂任务 | 配置相对复杂 |
| anacron | 弥补 cron 的不足 | 确保关键任务不被错过 | 仅支持日、周、月级别任务 |
| systemd 定时器 | 现代、复杂的定时需求 | 功能强大,与系统深度集成 | 学习曲线较陡 |
通过理解这些工具的特性和适用场景,你可以构建出高效、可靠的 Linux 自动化运维体系。


