at命令

at 命令 #

at命令用于在指定的时间执行一次性任务。它允许用户安排命令或脚本在未来的某个时间点运行,而不像cron那样定期重复执行。

语法 #

at [选项] 时间
at [选项] -f 文件 时间

常用选项 #

选项 描述
-f 文件 从指定文件读取命令,而不是标准输入
-m 即使没有输出,也发送邮件给用户
-v 显示任务将被执行的时间
-q 队列 使用指定的队列。队列名是单个字母,范围从a到z和A到Z。默认队列是a
-l 列出待处理的作业(等同于atq命令)
-d 作业号 删除指定的作业(等同于atrm命令)
-c 作业号 显示指定作业的命令

时间格式 #

at命令支持多种时间格式:

绝对时间 #

  • HH:MM:当天的指定小时和分钟(例如:14:30)
  • HH:MM YYYY-MM-DD:指定日期的指定时间(例如:14:30 2023-12-31)
  • YYYY-MM-DD:指定日期的午夜(例如:2023-12-31)

相对时间 #

  • now + N minutes/hours/days/weeks/months/years:从现在起N分钟/小时/天/周/月/年后
  • noon/midnight/teatime:当天的中午12点/午夜0点/下午4点

特殊关键字 #

  • now:立即(通常与相对时间一起使用)
  • noon:当天的中午12点
  • midnight:下一个午夜0点
  • teatime:下午4点

常见用法 #

1. 在特定时间执行命令 #

at 14:30

输入命令后,按Ctrl+D结束输入。

2. 在相对时间后执行命令 #

at now + 30 minutes

3. 在特定日期执行命令 #

at 10:00 2023-12-31

4. 从文件读取命令 #

at -f commands.txt 22:00

5. 列出待处理的作业 #

at -l

或者使用等效命令:

atq

6. 删除作业 #

at -d 作业号

或者使用等效命令:

atrm 作业号

7. 查看作业内容 #

at -c 作业号

实用示例 #

1. 安排系统关机 #

at 23:00
shutdown -h now
[Ctrl+D]

2. 在指定时间运行脚本 #

at midnight
/path/to/backup_script.sh
[Ctrl+D]

3. 在30分钟后发送提醒 #

at now + 30 minutes
echo "会议提醒!" | mail -s "重要会议" [email protected]
[Ctrl+D]

4. 在下周一早上执行命令 #

at 9:00 monday
/path/to/weekly_report.sh
[Ctrl+D]

5. 在特定日期备份数据库 #

at 02:00 2023-12-31
pg_dump database > /backup/database_$(date +\%Y\%m\%d).sql
[Ctrl+D]

6. 使用重定向输入命令 #

echo "/path/to/script.sh" | at 15:00

7. 使用不同的队列 #

at -q b now + 1 hour
echo "使用b队列的任务"
[Ctrl+D]

8. 在指定时间发送文件 #

at teatime
tar -czf /tmp/archive.tar.gz /important/files && scp /tmp/archive.tar.gz user@remote:/backup/ && rm /tmp/archive.tar.gz
[Ctrl+D]

访问控制 #

at命令的访问控制由两个文件管理:

  • /etc/at.allow:如果此文件存在,只有列在此文件中的用户可以使用at命令
  • /etc/at.deny:如果此文件存在(且at.allow不存在),除了列在此文件中的用户外,所有用户都可以使用at命令

如果两个文件都不存在,根据系统配置,可能只有超级用户可以使用at命令。

环境变量 #

at命令会保留大多数当前环境变量,包括:

  • 当前工作目录
  • 环境变量(如PATH、HOME等)
  • umask值

这意味着在at作业中执行的命令将在与提交作业时相同的环境中运行。

输出处理 #

默认情况下,at作业的输出会通过邮件发送给执行该作业的用户。如果不希望接收邮件,可以将输出重定向:

at 15:00
command > output.log 2>&1
[Ctrl+D]

与其他调度工具的比较 #

工具 用途 适用场景
at 一次性任务调度 需要在特定时间执行一次的任务
cron 定期重复任务 需要按计划定期执行的任务
batch 系统负载允许时执行任务 需要在系统资源充足时执行的任务
anacron 确保任务在系统启动后执行 适用于不是24/7运行的系统

相关命令 #

  • atq:列出待处理的at作业(等同于at -l
  • atrm:删除at作业(等同于at -d
  • batch:当系统负载允许时执行命令(使用at的变体)

常见问题排查 #

1. 作业未执行 #

可能的原因:

  • at服务未运行(检查:systemctl status atd
  • 用户在/etc/at.deny中或不在/etc/at.allow
  • 命令路径问题(使用绝对路径)
  • 环境变量问题

2. 无法查看或删除作业 #

可能的原因:

  • 权限不足(只有root用户和作业所有者可以查看或删除作业)
  • 作业已执行或被删除

3. 没有收到邮件通知 #

可能的原因:

  • 邮件系统未配置
  • 输出被重定向
  • 命令没有产生输出

提示 #

  • 使用绝对路径指定命令和脚本,避免路径问题
  • 考虑将输出重定向到文件,便于后续检查
  • 对于复杂的任务,最好创建脚本文件,然后使用at -f执行
  • 使用atq定期检查待处理的作业
  • 如果系统不是24/7运行,考虑使用anacron而不是at
  • 对于需要在低负载时执行的任务,使用batch命令
  • at命令中使用日期命令时,记得转义百分号(\%
  • 如果需要在at作业中使用图形界面程序,确保设置了DISPLAY环境变量