Linux系统之at, batch, atq, atrm 命令详解

atbatchatqatrm 是 Linux/Unix 系统中用于计划任务的工具,允许用户在特定时间或系统负载较低时执行命令。以下是各命令的详细说明:

  • at:在指定时间执行一次性任务
  • batch:系统空闲时自动执行任务
  • atq:查看待执行任务队列
  • atrm:删除已排队任务

1. at 命令

作用:在指定时间执行一次任务。

语法
at [选项] 时间
功能
  • 根据用户指定的 时间,将输入的命令放入队列,由 atd 守护进程执行。
  • 支持复杂的时间格式,包括相对时间、绝对时间、自然语言等。
选项
选项 说明
-V 显示版本号并退出。
-q queue 指定队列(队列名 a-zA-Z,大写字母队列默认按 batch 规则执行)。
-f file 从指定文件读取命令,而非标准输入。
-m 即使任务无输出,也发送邮件通知。
-M 禁用邮件通知。
-t time [[CC]YY]MMDDhhmm[.ss] 格式指定时间(如 202503272100)。
-v 显示任务实际执行时间后再读取命令。
-c job 显示指定任务的详细内容。
时间格式示例
  • 绝对时间
    at 14:30  # 下午2:30执行
    at 10am Jul 31  # 7月31日10点执行
    
  • 相对时间
    at now + 2 hours  # 2小时后执行
    at 4pm + 3 days  # 三天后的下午4点执行
    
  • 自然语言
    at teatime  # 下午4点执行(teatime)
    at midnight  # 午夜执行
    
示例
# 在今天下午4点执行命令
echo "echo 'Hello, World!' > /tmp/output.txt" | at 16:00

# 从文件读取命令并指定队列
at -f /path/to/script.sh -q a 202503281200

2. batch 命令

作用:在系统负载较低时执行任务。

语法
batch [选项]
功能
  • 将任务放入队列,仅当系统负载平均值低于 0.8(默认)时执行。
  • 通过 -q 指定队列时,需使用大写字母(如 A)。
示例
# 在负载低于0.8时执行脚本
echo "python /path/to/script.py" | batch

3. atq 命令

作用:列出所有待执行任务。

语法
atq [选项]
选项
选项 说明
-V 显示版本号。
-q queue 仅显示指定队列的任务。
输出格式
Job   123456    Thu Mar 27 21:00:00 2025  a  user
  • Job:任务编号。
  • 日期/时间:计划执行时间。
  • 队列:队列名称(如 a)。
  • 用户:任务提交者。
示例
# 查看所有任务
atq

# 查看队列 'b' 的任务
atq -q b

4. atrm 命令

作用:删除指定任务。

语法
atrm [选项] 任务编号...
选项
选项 说明
-V 显示版本号并退出。
示例
# 删除任务123456
atrm 123456

# 删除多个任务
atrm 123456 123457

关键特性与注意事项

1. 队列系统
  • 队列命名a-zA-Z,队列 aat 的默认队列,bbatch 的默认队列。
  • 优先级:队列字母越靠后,任务的 nice 值越高(优先级越低)。
  • 大写字母队列:提交到大写字母队列的任务会按 batch 规则执行(即等待负载下降)。
2. 邮件通知
  • 默认情况下,任务的输出和错误信息会通过邮件发送给用户。
  • -m:强制发送邮件(即使无输出)。
  • -M:禁用邮件通知。
3. 权限控制
  • 超级用户:可无限制使用。
  • 普通用户
    • /etc/at.allow 存在且包含用户名,或 /etc/at.deny 不包含用户名。
    • 若两个文件均不存在,默认允许所有用户。
4. 环境变量与限制
  • atsetuid 程序,仅保留部分环境变量(如 PATH, SHELL),其他变量(如 LD_LIBRARY_PATH)需手动设置。
  • 依赖 /proc 文件系统,否则可能无法正常工作。
5. 任务文件路径
  • 任务文件存储在 /var/spool/at/ 目录下。
  • 日志和状态文件:/var/run/utmp/etc/at.allow/etc/at.deny

常见问题与解决方案

1. 任务未执行
  • 原因atd 守护进程未运行。
  • 解决
    sudo systemctl start atd
    sudo systemctl enable atd
    
2. 邮件未收到
  • 原因:邮件服务器未配置(默认使用 /usr/sbin/sendmail)。
  • 解决:安装邮件工具(如 mailutils)或检查 /etc/aliases 配置。
3. 时间格式错误
  • 示例错误
    at: invalid time specification: "next week"
    
  • 解决:使用支持的格式(如 now +7 days)。

你可能感兴趣的:(运维,linux,服务器,运维,at,batch,atq,atrm)