at命令“提交成功”却未运行,根本原因是默认用/bin/sh执行且未启用atd服务;需启动atd、检查用户权限、用sh-c封装重定向命令、使用规范时间格式、注意环境变量缺失。

at 命令不能直接执行带重定向、管道或后台符号的命令,必须用 shell 封装;且默认不启用 atd 服务,不配置就永远不生效。
at 命令为什么“提交成功”却没运行?
常见现象是 at now + 1 minute 回车后输入 date > /tmp/at-test,按 Ctrl+D 显示 job 1 at ...,但一分钟后 /tmp/at-test 不存在。
- 根本原因是
at默认使用/bin/sh执行任务,而>是 shell 特性,不是date自身参数 —— 必须显式调用 shell 解析 - atd 服务未运行:
systemctl status atd很可能显示inactive (dead),需手动启动并设为开机自启 - 用户被限制:检查
/etc/at.allow(存在则仅列名用户可用)或/etc/at.deny(存在且含用户名则禁止),root 默认允许
正确提交带重定向/管道的任务
不能直接写 echo "hi" > /tmp/log,必须让 shell 解析重定向符号。
- 用
sh -c包裹整条命令:at now + 2 minutes→ 输入sh -c 'echo "run at $(date)" > /tmp/at-run.log' - 或写成脚本文件再提交:
echo '#!/bin/bash\necho "done" > /tmp/done' > /tmp/job.sh && chmod +x /tmp/job.sh,然后at now + 3 minutes - 避免使用
&后台运行:at 本身在子 shell 中异步执行,加&反而可能导致父 shell 退出后进程被 SIGTERM 终止
时间格式怎么写才不报错?
at 对时间字符串敏感,空格、大小写、缩写不规范都会导致 garbled time 错误。
- 推荐用绝对时间最稳:
at 14:30 tomorrow、at 09:00 May 25(注意月份首字母大写) - 相对时间慎用:
at now + 5 minutes✅,但at now+5min❌(缺少空格)、at now + 5 min❌(min不被识别,必须用minutes) - 避免模糊表达:
at noon可能因 locale 解析失败,at 12:00更可靠
如何查看、修改或删除已提交的 at 任务?
at 任务提交后无法直接编辑,只能删掉重提;且 atq 和 atrm 操作的是当前用户的队列(root 可看所有)。
- 查任务:
atq显示 job ID、时间、队列(通常是a)、用户;at -c 123查看 job 123 的完整执行环境与命令 - 删任务:
atrm 123(可一次删多个:atrm 123 124) - 注意权限:普通用户只能删自己的任务;root 可删任意,但删前建议先
at -c N确认内容,避免误删他人生产任务
真正容易被忽略的是环境变量 —— at 任务默认只有极简 PATH(通常不含 /usr/local/bin 或用户 ~/.local/bin),命令找不到、脚本中用到的自定义函数或别名全失效。要么在命令里写绝对路径,要么在 sh -c 开头显式加载 profile:sh -c '. ~/.bashrc; your_command'。











