
根本原因是atd服务未运行或用户被/etc/at.allow或/etc/at.deny拒绝;不同发行版默认权限策略不同,RHEL/CentOS仅允许root,Debian/Ubuntu允许所有本地用户(除非deny存在)。
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 2025 a user,则删时必须用 atrm 12345.a
/etc/at.allow 是否包含 root
atq 为空但你确定任务应存在,可能是 atd 在任务入队后崩溃过,此时队列文件(通常 /var/spool/at/ 下的 *.a 文件)可能残留,需手动清理(仅限 root,且确认 atd 已停)at 本身不维护高精度调度,它依赖系统时间与 atd 的轮询机制(默认每 60 秒扫描一次)。若系统时间跳变(如 NTP 矫正、虚拟机休眠唤醒),或 atd 进程卡住,就会导致偏差。
实操建议:
timedatectl status,确保 System clock synchronized: yes
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 快速验证基础执行环境。