要让 at 命令真正执行,必须启用 atd 服务、使用规范时间格式、用 sh -c 或脚本封装命令、并处理环境变量与权限限制;否则任务虽提交成功却不会运行。

要让 at 命令真正跑起来,光提交任务远远不够——它依赖 atd 服务、正确的时间格式、合适的命令封装和环境适配。很多用户遇到“提交成功但没执行”,问题几乎都出在这几个环节。
确保 atd 服务已启用并运行
at 命令本身只是“下单”,真正干活的是后台守护进程 atd。如果它没启动,所有任务都会静默积压、永不执行。
- 检查状态:
systemctl status atd,若显示inactive (dead),需手动启动 - 启用并开机自启:
sudo systemctl enable --now atd - 验证是否监听队列:
ps aux | grep atd或atq(无任务时可能提示空队列,但不报错即说明服务就绪)
时间格式必须规范,避免 garbled time 错误
at 对时间字符串非常敏感,一个空格或大小写错误就会导致解析失败。
- 推荐用绝对时间:如
at 15:30 tomorrow、at 09:00 July 20(月份首字母大写) - 相对时间要带单位全称和空格:
at now + 10 minutes✅,at now+10min❌,at now + 10 min❌ - 避免模糊词:
at noon在某些 locale 下可能失败,改用at 12:00更稳妥
命令必须由 shell 解析,重定向/管道不能裸写
at 默认调用 /bin/sh 执行命令,而 >、|、&& 是 shell 语法,不是命令自身参数——直接写会报错或静默忽略。
- 错误写法:
at now + 2 minutes→ 输入date > /tmp/at.log(不会生成文件) - 正确写法一(sh -c 封装):
at now + 2 minutes→ 输入sh -c 'date > /tmp/at.log' - 正确写法二(脚本文件):
chmod +x /path/to/script.sh && at now + 3 minutes
注意环境变量与权限限制
at 任务运行在极简环境中:PATH 很窄(通常不含 /usr/local/bin 或用户私有路径),没有别名、函数,也不读取 ~/.bashrc。
- 用绝对路径调用命令,例如
/usr/bin/python3 /opt/myscript.py而非python3 /opt/myscript.py - 检查访问控制:
/etc/at.allow(白名单,存在则仅列名用户可用)或/etc/at.deny(黑名单,root 始终允许) - 普通用户只能管理自己的任务;root 可用
atq查所有任务,用at -c 123预览内容后再删,防止误操作











