Linux中at命令不记录详细执行日志,输出默认邮件发送给用户;需结合系统日志查调度记录(如grep atd /var/log/syslog)、检查本地邮箱获取执行结果,或提交时重定向输出至文件。

Linux 中 at 命令本身不直接记录详细执行日志,它只把任务提交到队列并由 atd 守护进程调度执行;真正的执行输出(标准输出和标准错误)默认会通过邮件发送给提交用户,而系统级日志中仅保留少量调度信息。要查“详细执行日志”,需分两部分处理:一是确认任务是否被调度/执行,二是捕获任务实际运行时的输出。
查看 at 队列状态和调度记录
at 的调度行为由 atd 管理,其日志通常写入系统日志(如 /var/log/syslog 或 /var/log/messages),取决于发行版和 rsyslog 配置:
- 运行
sudo grep "atd" /var/log/syslog(Debian/Ubuntu)或sudo grep "atd" /var/log/messages(RHEL/CentOS)可看到任务入队、开始执行、完成等时间点记录,例如:
May 10 14:22:03 host atd[1234]: Job 1234567890.a will be executed at Sat May 10 14:25:00 2025 - 使用
journalctl -u atd -n 50 --since "1 hour ago"可实时查看最近的atd服务日志(systemd 系统) -
atq显示待执行任务列表,at -c <job_id></job_id>可查看某任务的完整执行环境(含命令、变量、工作目录等),但它不是运行日志,而是重建的执行脚本
获取任务实际执行输出(关键步骤)
at 默认将任务 stdout/stderr 发送邮件给提交者。若未配置本地邮件服务(如 mailutils + ssmtp 或 postfix),输出会丢失或存入 /var/mail/$USER(需用 mail 或 mutt 查看):
- 检查本地邮箱:
mail -f /var/mail/$USER(替换$USER为实际用户名),每封邮件对应一次at任务执行结果 - 若希望直接保存到文件而非邮件,提交时重定向输出,例如:
echo "date; ls /tmp" | at now + 1 minute<br> # 改为 → echo "date; ls /tmp > /tmp/at_job.log 2>&1" | at now + 1 minute
- 更可靠的做法是在
at脚本中显式追加日志:echo 'date >> /var/log/at-job.log; your_command >> /var/log/at-job.log 2>&1' | at now + 2 minutes
启用 atd 的详细调试日志(可选)
atd 默认日志级别较低。如需追踪调度细节(如权限拒绝、路径问题),可临时启用调试模式:
- 停止服务:
sudo systemctl stop atd(或sudo killall atd) - 手动启动带调试参数:
sudo atd -d -f(-d启用 debug,-f前台运行便于观察) - 此时所有调试信息会打印到终端,也可重定向:
sudo atd -d -f 2>&1 | tee /tmp/atd-debug.log - 注意:调试模式不适用于生产环境,仅用于排查调度失败原因
替代方案:用 systemd timer 替代 at(长期建议)
对于需要稳定日志记录的定时任务,at 并非最佳选择。systemd timer 天然集成 journal 日志,执行详情可通过 journalctl --unit=your-job.service 完整回溯,支持持久化、依赖管理、失败告警等特性,适合替代一次性 or 周期性任务。


















