Linux at命令详解:轻松调度延迟任务
目录
1. 什么是延迟用户任务?
1.1 延迟任务的概念
1.2 实际应用场景
2. at命令简介
2.1 at是什么?
2.2 at的工作原理
2.3 队列系统
3. 创建延迟任务
3.1 基本语法
3.2 输入命令的两种方式
方式一:交互式输入(键盘输入)
方式二:通过脚本文件输入
4. 时间规格详解
4.1 时间格式示例
4.2 时间规格详细说明
相对时间格式
绝对时间格式
4.3 日期逻辑规则
5. 查看和管理任务
5.1 查看待处理任务
5.2 理解atq输出格式
5.3 查看任务详情
6. 删除任务
6.1 删除单个任务
6.2 删除多个任务
7. 权限管理
7.1 用户权限规则
7.2 权限示例
8. 完整工作流程示例
场景:设置防火墙重置任务
1. 什么是延迟用户任务?
1.1 延迟任务的概念
延迟任务指的是在未来的特定时间点运行的一个或多个命令。想象一下,你需要让计算机在半夜自动执行备份,或者让某个命令在10分钟后自动运行,这就是延迟任务的典型应用场景。
1.2 实际应用场景
-
用户场景:计划在半夜执行耗时很长的系统维护任务
-
管理员场景:设置防火墙重置任务作为安全备份,如果新的防火墙配置正常,就取消这个重置任务
2. at命令简介
2.1 at是什么?
at是Red Hat Enterprise Linux中默认安装的任务调度工具,它包含三个核心组件:
-
atd守护进程:在后台运行,负责执行排队的任务
-
at命令:用于创建和管理延迟任务
-
atq命令:用于查看等待执行的任务队列
2.2 at的工作原理
用户使用at命令创建任务 → 任务加入队列 → atd守护进程在指定时间执行任务
2.3 队列系统
atd守护进程提供26个队列(a-z),具有以下特点:
-
队列按字母顺序排列
-
字母越靠后,系统优先级越低
-
默认情况下,任务会进入队列'a'
3. 创建延迟任务
3.1 基本语法
at TIMESPEC
3.2 输入命令的两种方式
方式一:交互式输入(键盘输入)
[user@host ~]$ at 14:30
at> echo "任务开始执行" > /tmp/at_result
at> date >> /tmp/at_result
at> <EOT> # 按Ctrl+D结束输入
job 5 at Thu May 19 14:30:00 2022
方式二:通过脚本文件输入
# 创建脚本文件
[user@host ~]$ cat > myscript << EOF
echo "这是自动执行的任务"
date
whoami
EOF# 使用输入重定向调度任务
[user@host ~]$ at now +5min < myscript
job 6 at Thu May 19 21:06:00 2022
4. 时间规格详解
4.1 时间格式示例
at命令支持多种自然语言时间格式:
| 时间格式 | 说明 | 示例 |
|---|---|---|
| 具体时间 | 24小时制或12小时制 | 14:30, 02:30pm |
| 相对时间 | 从当前时间开始计算 | now +5min, now +1 hour |
| 特殊时间点 | 预定义的时间名称 | midnight, noon, teatime |
| 完整日期时间 | 指定具体日期和时间 | 5pm august 3 2021 |
4.2 时间规格详细说明
相对时间格式
# 几分钟后
at now +5min
at now +10 minutes# 几小时后
at now +1 hour
at now +2 hours# 几天后
at now +3 days
绝对时间格式
# 今天或明天的具体时间
at 21:00 # 如果现在21:01,则安排到明天21:00
at 21:03 # 如果现在21:01,则安排到今天21:03# 指定具体日期
at 14:30 tomorrow
at teatime august 3 2023 # teatime是16:00
at noon +4 days # 4天后的中午12点
4.3 日期逻辑规则
-
只提供时间:日期默认为当天或第二天(如果时间已过)
-
只提供日期:时间默认为当前时间
-
时间和日期都提供:按指定时间执行
5. 查看和管理任务
5.1 查看待处理任务
# 使用atq命令
[user@host ~]$ atq
28 Mon May 16 05:13:00 2022 a user
29 Tue May 17 16:00:00 2022 h user
30 Wed May 18 12:00:00 2022 a user# 或者使用at -l命令(效果相同)
[user@host ~]$ at -l
5.2 理解atq输出格式
每行输出的含义:
作业编号 执行时间 队列 所有者
-
作业编号:任务的唯一标识符
-
执行时间:任务计划运行的具体时间
-
队列:任务所在的队列(a-z)
-
所有者:创建该任务的用户
5.3 查看任务详情
# 查看作业编号为28的任务详情
[user@host ~]$ at -c 28
这个命令会显示:
-
任务执行时的环境变量
-
将要运行的具体命令
-
其他执行上下文信息
6. 删除任务
6.1 删除单个任务
# 删除作业编号为28的任务
[user@host ~]$ atrm 28# 或者使用等效命令
[user@host ~]$ at -d 28
6.2 删除多个任务
# 一次性删除多个任务
[user@host ~]$ atrm 28 29 30
7. 权限管理
7.1 用户权限规则
-
普通用户:只能查看和管理自己创建的任务
-
root用户:可以查看和管理系统中所有用户的任务
7.2 权限示例
# 普通用户user1只能看到自己的任务
[user1@host ~]$ atq
31 Thu May 19 10:00:00 2022 a user1# root用户可以看到所有用户的任务
[root@host ~]$ atq
31 Thu May 19 10:00:00 2022 a user1
32 Fri May 20 15:30:00 2022 b user2
8. 完整工作流程示例
场景:设置防火墙重置任务
# 1. 创建重置脚本
[admin@host ~]$ cat > reset_firewall.sh << EOF
#!/bin/bash
echo "$(date): 重置防火墙配置" >> /var/log/firewall_reset.log
# 这里放置具体的防火墙重置命令
EOF# 2. 调度10分钟后执行
[admin@host ~]$ at now +10min < reset_firewall.sh
job 33 at Thu May 19 21:11:00 2022# 3. 确认任务已调度
[admin@host ~]$ atq
33 Thu May 19 21:11:00 2022 a admin# 4. 如果新的防火墙配置正常,删除重置任务
[admin@host ~]$ atrm 33
