根本原因是atd服务未运行或用户被/etc/at.allow或/etc/at.deny拒绝;不同发行版默认权限策略不同,RHEL/CentOS仅允许root,Debian/Ubuntu允许所有本地用户(除非deny存在)。

at 任务提交后 atq 查不到,任务直接消失
根本原因通常是 atd 服务未运行,或用户被 /etc/at.allow / /etc/at.deny 显式拒绝。Linux 发行版默认策略差异大:RHEL/CentOS 默认只允许 root,Debian/Ubuntu 默认允许所有本地用户(除非配置了 deny 文件)。
实操建议:
- 先确认服务状态:
systemctl status atd,若 inactive,请systemctl enable --now atd - 检查权限控制文件:
ls -l /etc/at.allow /etc/at.deny 2>/dev/null;若/etc/at.allow存在,则只有其中列出的用户能用at;若不存在但/etc/at.deny存在且含用户名,则该用户被禁止 - 普通用户提交失败时,
at命令通常静默退出,不会报错——可加-f指定脚本并配合echo $?查看退出码(非零即失败)
atq 能看到任务,但到期后不执行且无日志
常见于任务中使用了相对路径、未指定 SHELL 环境、或依赖交互式终端。at 默认以提交用户身份、在空环境(env -i 类似)下执行,PATH 极简(常只有 /usr/bin:/bin),且不加载 ~/.bashrc 等配置。
实操建议:
- 任务脚本第一行务必写
#!/bin/bash,并在脚本内显式设置所需变量,如PATH="/usr/local/bin:/usr/bin:/bin" - 所有命令用绝对路径,或在脚本开头
cd /full/path/to/workdir - 避免依赖
$HOME或当前工作目录;如需邮件通知,确保MAILTO环境变量已设(export MAILTO="user@example.com"),且系统有可用 MTA(如ssmtp、postfix)
atrm 删除失败:提示 “job not found” 或 “you do not own this job”
atrm 只能删除自己提交的任务(root 除外),且必须使用 atq 显示的原始 job ID(如 12345.a),不能省略后缀、不能用时间戳或描述匹配。
实操建议:
- 先运行
atq确认 job ID 格式,例如输出为12345.a Wed Jun 12 10:30:00 2024 a user,则删时必须用atrm 12345.a - 普通用户无法删除其他用户的任务,即使知道 ID;root 可删任意任务,但需注意:某些发行版(如 RHEL 8+)默认禁用 root 的 at 任务提交,需检查
/etc/at.allow是否包含root - 如果
atq为空但你确定任务应存在,可能是atd在任务入队后崩溃过,此时队列文件(通常/var/spool/at/下的*.a文件)可能残留,需手动清理(仅限 root,且确认atd已停)
at 队列时间不准、任务提前/延后执行
at 本身不维护高精度调度,它依赖系统时间与 atd 的轮询机制(默认每 60 秒扫描一次)。若系统时间跳变(如 NTP 矫正、虚拟机休眠唤醒),或 atd 进程卡住,就会导致偏差。
实操建议:
- 检查系统时间同步状态:
timedatectl status,确保System clock synchronized: yes - 不要依赖 at 做秒级精度任务;需精确调度请改用
systemd timer或cron - 若发现大量任务堆积未执行,检查
atd日志:journalctl -u atd -n 50 --no-pager,重点关注 “can't fork”、“permission denied” 或 “failed to stat” 类错误
at 里就可能因缺少 PATH、HOME、甚至 LANG 而静默失败。每次调试,先用 echo "env && pwd && ls -l" | at now + 1 minute 快速验证基础执行环境。










