Linux系统定时任务管理深入解析
一次性与周期性任务调度机制
在Linux系统中,自动化运维常依赖于计划任务功能。系统可通过at和cron工具实现命令的自动执行,分别适用于仅运行一次和重复执行的场景。CentOS等主流发行版默认预装at与cronie软件包,并通过atd和crond两个后台服务支撑其运行。
使用at命令执行单次任务
at指令用于安排在特定时间点仅执行一次的任务,要求atd服务处于激活状态。设定的时间必须晚于当前系统时间,否则任务无法被正确注册。
权限控制机制
at命令的访问权限由以下文件决定:
- 若存在
/etc/at.allow,则只有列在此文件中的用户可使用at; - 若不存在allow文件但存在
/etc/at.deny,则deny列表外的所有用户均可使用; - 若两者均不存在,则仅root账户有权使用at功能。
多数系统默认提供空的/etc/at.deny,表示允许所有用户提交任务。如需禁止某用户,只需将其用户名写入该文件即可,每行一个账号。
任务创建方式
输入at命令并指定时间参数后,将进入交互式编辑界面(提示符为at>),每行输入一条待执行命令,最后按Ctrl+D结束输入并提交任务。
时间格式说明
at [选项] 时间定义
常见时间表达形式包括:
- HH:MM:当天指定时刻执行,若已过则顺延至次日;
- HH:MM YYYY-MM-DD:精确到年月日时分;
- noon / midnight / teatime:分别代表中午12点、午夜0点、下午4点;
- tomorrow:明日同一时间;
- now + 数值 单位:例如
now + 30 minutes或5pm + 2 days。
常用选项
| -V | 显示版本信息 |
| -t | 使用时间戳格式 [[CC]YY]MMDDhhmm[.ss] |
| -l 或 atq | 列出当前待处理任务 |
| -d 或 atrm | 删除指定ID的任务 |
| -c ID | 查看任务具体内容 |
| -f 路径 | 从文件读取任务脚本 |
| -m | 任务完成后发送邮件通知(即使无输出) |
示例操作
# 统计root进程数量并保存 [root@host ~]# at 14:05 at> pgrep -U root | wc -l > /tmp/root_procs at> <EOT> job 5 at Mon Sep 9 14:05:00 2019 # 查看待执行队列 [root@host ~]# atq 5 Mon Sep 9 14:05:00 2019 a root # 删除任务 [root@host ~]# atrm 5
batch:基于系统负载延迟执行
batch本质上是at的一个变体,它会在系统负载低于0.8时才触发任务执行。此特性适合运行对性能敏感的低优先级作业。
[root@host ~]# batch at> gzip /data/f1.log at> <EOT>
可用uptime命令查看当前系统的平均负载情况。
所有at/batch任务存储于/var/spool/at/目录下,确保atd服务运行是前提条件。
cron周期性任务管理
cron用于设置重复执行的计划任务,依赖crond守护进程持续监控。相比at,更适合日常维护类操作。
配置结构与路径
/etc/crontab:系统级主配置文件;/etc/cron.d/:附加配置目录;/etc/cron.hourly/,/etc/cron.daily/,/etc/cron.weekly/,/etc/cron.monthly/:按周期存放可执行脚本。
/etc/crontab 文件详解
该文件包含环境变量定义及任务条目模板:
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=admin@example.com # .---------------- 分钟 (0–59) # | .------------- 小时 (0–23) # | | .---------- 日期 (1–31) # | | | .------- 月份 (1–12) # | | | | .---- 星期 (0–6, 0和7均为周日) # | | | | | # * * * * * 用户名 命令
用户级任务存储位置
每个用户的cron任务独立保存在/var/spool/cron/<username>文件中,由crond进程实时监听变更,无需重启服务即可生效。
crontab命令操作
| -e | 编辑当前用户任务列表 |
| -l | 列出当前任务 |
| -r | 清除全部任务 |
| -u user | 指定目标用户(通常仅限root使用) |
时间字段语法
五段式时间格式:
* * * * * command │ │ │ │ │ │ │ │ │ └── 星期几 (0–6) │ │ │ └──── 月份 (1–12) │ │ └────── 日期 (1–31) │ └──────── 小时 (0–23) └────────── 分钟 (0–59)
特殊符号用法
- *:任意值;
- ,:列举多个值,如
1,3,5; - -:范围,如
9-17表示上午9点到下午5点; - /:步长,如
*/10在分钟字段表示每10分钟一次; - L:月末或最后一周的星期几,如
6L表示"本月最后一个周六"。
典型表达式示例
# 每小时整点执行 0 * * * * # 每两小时执行一次 0 */2 * * * # 每月10号及每周一至周三11:00执行 0 11 10 * 1-3 # 每天14:01至14:40之间每分钟执行 1-40 14 * * * # 工作日每隔5小时执行(早上8点开始) 0 8-16/5 * * 1-5 # 每年3月至6月的1、10、20号或每月周日执行 * * 1,10,20 3-6 0
实际应用案例
# 编辑任务 [root@host ~]# crontab -e # 添加如下内容: 0 8 * * * /usr/bin/systemctl start httpd # 每天8点启动Web服务 0 3 */5 * * /usr/bin/find /tmp -type f -mtime +7 -delete # 每隔5天清理旧临时文件
注意事项
- 当同时指定了日期和星期字段时,任一条件满足即触发任务(逻辑"或"关系);其余字段为"与"关系。
- 输出默认通过邮件发送给用户,建议重定向避免垃圾邮件:
* * * * * /script.sh >/dev/null 2>&1 - %字符在cron中有特殊含义(换行符),若需使用应转义为\%,或将命令封装进脚本。
- 推荐使用绝对路径调用程序,防止因PATH缺失导致执行失败。
查看与删除任务
# 查看当前用户任务 crontab -l # 查看其他用户任务(需root权限) crontab -u lisi -l # 删除全部任务 crontab -r
anacron:弥补关机期间遗漏任务
对于非7x24运行的设备(如办公电脑周末关机),标准cron可能错过预定任务。anacron通过记录上次执行时间戳,在系统启动后检测是否错过了daily、weekly或monthly任务,并予以补执行。
其核心机制在于比较当前时间和上次运行时间,判断是否有周期未覆盖,从而唤醒延迟任务。anacron不会替代cron,而是作为补充共存。
日志追踪
可通过实时查看日志确认任务执行状态:
tail -f /var/log/cron
该日志记录了所有计划任务的触发时间、执行命令及结果信息。