CE(Linux的例行性工作)

在 Linux 系统管理中,例行性工作(定时任务)是提高效率、实现自动化运维的关键工具。无论是一次性执行的临时任务,还是周期性重复的常规操作,都可以通过系统提供的工具轻松实现。本文将详细介绍 Linux 中两种常用的例行性工作工具:at(单一执行)和 crontab(循环执行),包括安装、配置、使用场景及实战案例。

一、单一执行的例行性任务:at 命令

at 命令用于在指定时间执行一次任务,适合处理临时的、一次性的计划任务(如凌晨 2 点自动备份一次数据)。

1.1 安装与服务管理

at 命令需要单独安装,且依赖 atd 服务运行,步骤如下:

  1. 安装 at 工具使用 yum 包管理器安装:

    复制代码
    [root@server ~]# yum install at -y
  2. 验证安装查看版本确认安装成功:

    复制代码
    [root@server ~]# at -V   # 大写 V
    at version 3.2.2
  3. 管理 atd 服务 at 命令依赖 atd 守护进程,需确保服务启动并设置开机自启:

    复制代码
    # 启动服务
    [root@server ~]# systemctl start atd
    
    # 设置开机自启(同时启动服务)
    [root@server ~]# systemctl enable --now atd
    
    # 查看服务状态
    [root@server ~]# systemctl status atd

1.2 at 命令的权限控制

at 命令的使用权限由以下两个文件控制(优先级从高到低):

  1. 白名单 /etc/at.allow 若该文件存在,只有写入文件中的用户 可使用 at 命令。

  2. 黑名单 /etc/at.deny/etc/at.allow 不存在,则检查此文件,写入文件中的用户被禁止 使用 at 命令。

  3. 默认规则 若两个文件都不存在,仅 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 服务通常默认安装并自启动,若未安装可手动配置:

  1. 安装 crontabs 包

    复制代码
    [root@server ~]# yum install crontabs -y
  2. 查看服务状态

    复制代码
    [root@server ~]# systemctl status crond

    crond 进程每分钟会检查一次任务列表,若到执行时间则自动运行任务。

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 分钟向指定邮箱发送内存告警邮件:

  1. 安装邮件服务

    复制代码
    [root@server ~]# yum install s-nail -y
  2. 配置 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
  3. 测试邮件发送

    复制代码
    [root@server ~]# echo "测试邮件内容" | s-nail -s "测试主题" 你的QQ号@qq.com
  4. 创建定时任务

    复制代码
    [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. 字段不能为空 :若不确定时间,用 * 表示任意值。
  2. 时间精度限制:最小单位为分钟,不支持秒级任务;最大单位为月,不支持跨年指定。
  3. 日期与星期冲突 :避免同时指定 "日期" 和 "星期",可能导致混淆(如 * * 1 1 1 表示 1 月 1 日或周一,而非两者同时满足)。
  4. 绝对路径 :命令或脚本建议使用绝对路径(如 /bin/ls),避免因环境变量问题导致执行失败。
  5. 日志排查 :任务未执行时,查看 /var/log/cron 日志定位问题。

三、总结

  • at 适用于一次性任务,如临时备份、定时执行脚本等,时间格式灵活,支持延迟执行。
  • crontab 适用于周期性任务,如日志轮转、系统监控等,通过时间字段精确控制执行频率。
  • 权限控制通过白名单 / 黑名单实现,系统级任务与用户级任务分离,满足不同场景需求。
相关推荐
歪歪1002 小时前
解决多 Linux 客户端向 Windows 服务端的文件上传、持久化与生命周期管理问题
linux·运维·服务器·开发语言·前端·数据库·windows
不一样的少年_2 小时前
【前端效率工具】再也不用 APIfox 联调!零侵入 Mock,全程不改代码、不开代理
前端·javascript·浏览器
IT_陈寒2 小时前
JavaScript 性能优化实战:我通过这7个技巧将页面加载速度提升了65%
前端·人工智能·后端
JIngJaneIL3 小时前
数码商城系统|电子|基于SprinBoot+vue的商城推荐系统(源码+数据库+文档)
java·前端·数据库·vue.js·论文·毕设·数码商城系统
GISer_Jing3 小时前
Flutter架构解析:从引擎层到应用层
前端·flutter·架构
GISer_Jing3 小时前
Flutter开发全攻略:从入门到精通
android·前端·flutter
艾小码3 小时前
Vue组件通信不再难!这8种方式让你彻底搞懂父子兄弟传值
前端·javascript·vue.js
lcc1873 小时前
Vue 数据代理
前端·javascript·vue.js
Moment3 小时前
为什么我们从 Python 迁移到 Node.js
前端·后端·node.js