CE(Linux的例行性工作)
在 Linux 系统管理中,例行性工作(定时任务)是提高效率、实现自动化运维的关键工具。无论是一次性执行的临时任务,还是周期性重复的常规操作,都可以通过系统提供的工具轻松实现。本文将详细介绍 Linux 中两种常用的例行性工作工具:at(单一执行)和 crontab(循环执行),包括安装、配置、使用场景及实战案例。
一、单一执行的例行性任务:at 命令
at 命令用于在指定时间执行一次任务,适合处理临时的、一次性的计划任务(如凌晨 2 点自动备份一次数据)。
1.1 安装与服务管理
at 命令需要单独安装,且依赖 atd 服务运行,步骤如下:
-
安装 at 工具使用 yum 包管理器安装:
[root@server ~]# yum install at -y -
验证安装查看版本确认安装成功:
[root@server ~]# at -V # 大写 V at version 3.2.2 -
管理 atd 服务
at命令依赖atd守护进程,需确保服务启动并设置开机自启:# 启动服务 [root@server ~]# systemctl start atd# 设置开机自启(同时启动服务) [root@server ~]# systemctl enable --now atd# 查看服务状态 [root@server ~]# systemctl status atd
1.2 at 命令的权限控制
at 命令的使用权限由以下两个文件控制(优先级从高到低):
-
白名单
/etc/at.allow若该文件存在,只有写入文件中的用户可使用at命令。 -
黑名单
/etc/at.deny若/etc/at.allow不存在,则检查此文件,写入文件中的用户被禁止使用at命令。 -
默认规则若两个文件都不存在,仅 root 用户可使用
at命令。
1.3 命令格式与参数
at 命令的基本格式为:
at [参数] 日期时间
常用参数说明:
| 参数 | 作用 |
|---|---|
-m | 任务完成后,即使无输出,也向用户发送邮件通知 |
-l | 列出当前所有 at 任务(等价于 atq) |
-d | 删除指定任务(等价于 atrm) |
-v | 以详细时间格式列出任务 |
-c | 查看任务的具体命令内容 |
-f | 从文件中读取命令作为任务内容 |
1.4 时间格式
at 支持多种时间格式,灵活适配不同场景:
| 时间格式 | 说明 |
|---|---|
HH:MM | 如 14:30,表示当天的 14 点 30 分;若时间已过,则自动延后到次日 |
HH:MM YYYY-MM-DD | 如 02:00 2024-12-31,指定具体日期和时间 |
now + 数字 单位 | 从当前时间开始延迟执行,单位支持 minutes(分钟)、hours(小时)、days(天)、weeks(周),如 now + 30 minutes(30 分钟后) |
1.5 实战案例
案例 1:交互模式创建任务
延迟执行 ls /root 并将结果写入 at.txt:
# 指定 14:17 执行任务
[root@server ~]# at 14:17
warning: commands will be executed using /bin/sh
at> ls /root > at.txt # 输入要执行的命令
at> <EOT> # 按 Ctrl+D 结束输入# 查看任务列表
[root@server ~]# at -l # 或 atq
3 Thu May 25 14:17:00 2023 a root
注意:
at任务的输出不会直接显示到屏幕,需通过重定向(如> file)保存。- 命令建议使用绝对路径(如
/bin/ls),避免环境变量问题。
案例 2:非交互模式创建任务
通过管道符直接传递命令,无需交互:
# 1 分钟后向 at.txt 追加 "hello again"
[root@server ~]# echo "echo 'hello again' >> at.txt" | at now +1 minute
案例 3:限制用户使用 at 命令
禁止用户 ce1 使用 at 命令:
# 创建用户 ce1
[root@server ~]# useradd ce1
[root@server ~]# passwd ce1 # 设置密码(示例:123)# 将 ce1 加入黑名单
[root@server ~]# vim /etc/at.deny
# 在文件中添加一行:ce1# 切换到 ce1 测试
[root@server ~]# su - ce1
[ce1@server ~]$ at 14:36 # 执行 at 命令
You do not have permission to use at. # 提示无权限
查看任务执行日志
at 任务的执行记录保存在 /var/log/cron 中,可通过以下命令查看:
[root@server ~]# tail -f /var/log/cron # 实时跟踪日志
二、循环执行的例行性任务:crontab 命令
crontab 用于周期性重复执行任务(如每天凌晨备份、每小时清理日志),依赖 crond 守护进程,是自动化运维的核心工具。
2.1 crond 服务管理
crond 服务通常默认安装并自启动,若未安装可手动配置:
-
安装 crontabs 包
[root@server ~]# yum install crontabs -y -
查看服务状态
[root@server ~]# systemctl status crondcrond进程每分钟会检查一次任务列表,若到执行时间则自动运行任务。
2.2 权限控制与工作原理
权限控制
与 at 类似,crontab 的权限由以下文件控制:
/etc/cron.allow:白名单,仅列出的用户可使用crontab(优先级高于黑名单)。/etc/cron.deny:黑名单,列出的用户被禁止使用crontab。
工作原理
- 用户创建的
crontab任务会保存在/var/spool/cron/用户名文件中。 - 所有任务的执行记录会写入
/var/log/cron日志文件。
2.3 命令格式与参数
crontab 命令的基本格式为:
crontab [-u 用户] [-l | -r | -e]
常用参数说明:
| 参数 | 作用 |
|---|---|
-l | 列出当前用户的所有定时任务 |
-e | 编辑当前用户的定时任务(推荐使用) |
-r | 删除当前用户的所有定时任务(谨慎使用) |
-i | 删除任务时提示确认(避免误操作) |
-u 用户 | 管理指定用户的定时任务(仅 root 可用) |
2.4 定时任务的时间格式
编辑 crontab 任务(crontab -e)时,每一行代表一个任务,格式为6 个字段:
分钟 小时 日期 月份 星期 命令
字段说明:
| 字段 | 取值范围 | 含义 |
|---|---|---|
| 分钟 | 0-59 | 一小时内的第几分钟 |
| 小时 | 0-23 | 一天内的第几小时 |
| 日期 | 1-31 | 一个月内的第几天 |
| 月份 | 1-12 | 一年中的第几个月 |
| 星期 | 0-7(0 和 7 均代表周日) | 一周中的第几天 |
| 命令 | - | 要执行的命令(建议用绝对路径) |
特殊字符
时间字段支持特殊字符,增强灵活性:
| 字符 | 含义 |
|---|---|
* | 匹配任意值,如 * 在 “分钟” 字段表示每分钟 |
- | 表示范围,如 1-5 在 “星期” 字段表示周一到周五 |
, | 表示多个值,如 1,15 在 “日期” 字段表示每月 1 号和 15 号 |
*/n | 表示每隔 n 单位,如 */10 在 “分钟” 字段表示每 10 分钟 |
2.5 时间格式示例
| 时间表达式 | 含义 |
|---|---|
1 2 * * * | 每天凌晨 2 点 01 分执行 |
0 17 * * 1 | 每周一 17 点整执行 |
0 5 1,15 * * | 每月 1 号和 15 号凌晨 5 点执行 |
40 4 * * 1-5 | 每周一至周五凌晨 4 点 40 分执行 |
*/10 4 * * * | 每天凌晨 4 点,每隔 10 分钟执行一次 |
3,15 8-11 */2 * * | 每隔 2 天的 8 点至 11 点,第 3 分钟和第 15 分钟执行 |
2.6 实战案例
案例 1:每 2 分钟广播系统时间
每 2 分钟向所有登录用户广播当前时间:
# 编辑任务
[root@server ~]# crontab -e
# 加入以下内容(每分钟的第 0 秒执行,间隔 2 分钟)
*/2 * * * * wall $(date)# 查看任务
[root@server ~]# crontab -l
*/2 * * * * wall $(date)# 删除任务(谨慎操作)
[root@server ~]# crontab -r
案例 2:每周一凌晨 6 点重启系统
[root@server ~]# crontab -e
# 加入以下内容(凌晨 6 点 0 分,每周一执行)
0 6 * * 1 /sbin/shutdown -r now
案例 3:定时发送告警邮件
配置每 1 分钟向指定邮箱发送内存告警邮件:
-
安装邮件服务
[root@server ~]# yum install s-nail -y -
配置 QQ 邮箱(以 QQ 邮箱为例)
- 登录 QQ 邮箱,开启
POP3/SMTP服务,获取授权码(非登录密码)。 - 编辑邮件配置文件:
[root@server ~]# vim /etc/s-nail.rc # 末尾添加以下内容(替换为你的账号和授权码) set from="你的QQ号@qq.com" set mta=smtps://你的QQ号:授权码@smtp.qq.com:465 set smtp-auth=login
- 登录 QQ 邮箱,开启
-
测试邮件发送
[root@server ~]# echo "测试邮件内容" | s-nail -s "测试主题" 你的QQ号@qq.com -
创建定时任务
[root@server ~]# crontab -e # 每 1 分钟发送告警邮件 * * * * * echo "警告:SERVER服务器内存较低,请及时处理" | mail -v -s "内存告警" 你的QQ号@qq.com
2.7 系统级别的定时任务
除了用户级任务,Linux 还支持系统级定时任务,适合全局操作(如日志备份、系统清理),通过以下方式配置:
1. 系统任务目录
系统预设了按周期执行的任务目录,将脚本放入对应目录即可自动执行:
[root@server ~]# ls -l /etc/ | grep cron*
cron.d # 自定义系统任务
cron.daily # 每天执行的任务
cron.hourly # 每小时执行的任务
cron.monthly # 每月执行的任务
cron.weekly # 每周执行的任务
2. 编辑 /etc/crontab 文件
/etc/crontab 是系统级任务的配置文件,仅 root 可编辑,格式与用户级任务类似,但多了 “用户名” 字段:
# 格式:分钟 小时 日期 月份 星期 用户名 命令
[root@server ~]# vim /etc/crontab
示例 1:每周二 11 点将系统时间写入 /t1.txt:
0 11 * * 2 root date >> /t1.txt
示例 2:每天 6 点备份 /var/log/messages 到 /backup,文件名含日期:
# 先创建备份目录
[root@server ~]# mkdir /backup# 编辑 /etc/crontab,加入以下内容
0 6 * * * root /bin/cp /var/log/messages /backup/logfile`date +\%Y-\%m-\%d`
注意:
crontab中%需用\转义(如\%Y),否则会被解析为换行符。
2.8 注意事项
- 字段不能为空:若不确定时间,用
*表示任意值。 - 时间精度限制:最小单位为分钟,不支持秒级任务;最大单位为月,不支持跨年指定。
- 日期与星期冲突:避免同时指定 “日期” 和 “星期”,可能导致混淆(如
* * 1 1 1表示 1 月 1 日或周一,而非两者同时满足)。 - 绝对路径:命令或脚本建议使用绝对路径(如
/bin/ls),避免因环境变量问题导致执行失败。 - 日志排查:任务未执行时,查看
/var/log/cron日志定位问题。
三、总结
at适用于一次性任务,如临时备份、定时执行脚本等,时间格式灵活,支持延迟执行。crontab适用于周期性任务,如日志轮转、系统监控等,通过时间字段精确控制执行频率。- 权限控制通过白名单 / 黑名单实现,系统级任务与用户级任务分离,满足不同场景需求。
