at任务不执行或“消失”主因是调度失败、环境缺失或系统限制,需从队列状态(atq)、atd服务(systemctl status atd)、执行环境(绝对路径、显式变量、权限)及系统限制(at.allow/deny、发行版默认策略)四方面排查。

at 任务在安排后不执行或“消失”,通常不是任务被删除,而是调度失败、环境缺失或系统限制导致未触发。关键要从队列状态、执行环境、系统配置三方面快速定位。
确认 at 队列中任务是否真实存在
使用 atq 查看当前待执行的 at 任务列表(含任务号、时间、队列名):
- 若任务不在输出中,说明已执行完毕、被取消,或提交时因语法/权限问题根本未入队
- 若任务存在但时间已过却未执行,大概率是 atd 服务异常或任务运行时环境不满足
- 注意:不同用户需用 atq -u 用户名 查看,root 可查全部;普通用户只能看到自己的任务
检查 atd 服务状态与日志
at 依赖后台服务 atd 轮询调度,服务停止或崩溃会导致所有任务挂起:
- 运行 systemctl status atd(或 service atd status)确认服务处于 active (running)
- 若服务未运行,启动它:sudo systemctl start atd,并设为开机自启:sudo systemctl enable atd
- 查看 atd 日志:sudo journalctl -u atd -n 50 –no-pager,重点关注 “Error”、“failed”、“cannot execute” 类提示
验证任务执行时的环境与权限
at 任务默认以提交时的用户身份、在最小化 shell 环境(通常是 /bin/sh)中运行,极易因路径、变量、权限失败而静默退出:
- 避免使用相对路径——脚本、文件必须用绝对路径(如 /home/user/script.sh 而非 ./script.sh)
- 不要依赖当前 shell 的环境变量(如 PATH、HOME),应在 at 命令中显式设置,例如:
echo ‘/usr/bin/python3 /opt/myscript.py’ | at now + 1 minute - 确保目标用户对脚本和所有依赖文件有读取+执行权限,且 atd 服务未被 SElinux/appArmor 限制(常见于 centos/RHEL 或 ubuntu Server)
排查系统级限制与特殊场景
某些发行版或安全策略会主动禁用或限制 at 功能: