排查at任务未执行,需依次确认:任务是否入队(atq)、atd服务是否active(running)、执行环境是否满足(绝对路径、显式变量、权限)、系统策略是否允许(/etc/at.{allow,deny}及/var/spool/at权限)。

排查 at 任务未能按时运行,核心是确认任务是否真正进入调度队列、atd 是否正常工作、执行环境是否满足,以及系统策略是否允许。不是“提交了就等于会跑”,很多问题在提交时已静默失败。
先看任务有没有进队列
用 atq 查当前用户的待执行任务:
- 如果任务完全没出现,说明提交失败——可能是时间格式错误(如
now+5min缺空格)、用户被禁止(/etc/at.deny含用户名或/etc/at.allow未包含该用户) - 如果任务显示在列表里但时间已过仍未执行,问题不在提交环节,而是后续环节出错
- root 用户可用
atq -u username查他人任务;普通用户只能看到自己的
检查 atd 服务是否真在运行
at 命令只是“下单”,真正干活的是后台服务 atd。它不运行,所有任务都会卡住:
- 运行
systemctl status atd,必须看到active (running) - 若显示
inactive (dead)或failed,执行sudo systemctl start atd && sudo systemctl enable atd - 注意:Ubuntu 22.04+、CentOS 8+ 等新系统默认不启用 atd,装完系统后需手动开启
- 查日志:
sudo journalctl -u atd -n 30 --no-pager,重点找error、cannot execute、permission denied
验证执行环境是否可靠
at 任务以极简环境运行(/bin/sh,PATH 通常只有 /usr/bin:/bin,无家目录、无 shell 配置文件),极易因路径或变量缺失失败:
- 所有命令、脚本、文件路径必须用绝对路径(
/home/user/script.sh,不能写~/script.sh或./script.sh) - 带重定向(
>)、管道(|)、后台(&)的命令,必须用sh -c '...'封装,例如:sh -c 'date > /tmp/log' - 需要自定义环境变量?在命令前显式设置:
export PATH="/usr/local/bin:$PATH"; /usr/local/bin/mytool - 脚本第一行写明解释器(
#!/bin/bash),并确保有执行权限(chmod +x)
确认系统级限制和权限细节
有些限制不报错,只让任务无声消失:
- 检查
/var/spool/at权限:ls -ld /var/spool/at应为drwxr-xr-x daemon:daemon(CentOS/RHEL)或daemon:at(Debian/Ubuntu),权限不能是 777 或含 sticky bit - 确认
/etc/at.allow和/etc/at.deny的存在与内容:两者都不存在时通常开放;只有at.deny且含用户名则禁止;只有at.allow则仅名单内用户可用 - 某些发行版(如 Alpine)默认不装 atd,只装 at 客户端,需额外安装(
apk add at) - 任务时间设为过去时刻,at 会直接忽略(不提示、不入队),可用
date -d "now + 2 minutes"提前校验时间表达式











