Obsidian
Mac
在Mac使用终端命令安装DMG
终端无法访问外挂硬盘
小诗词
SSH 无密码登录及 Rsync 同步配置笔记
Cron专题
at 命令笔记
Kostal 服务器密码
Docker 安装指南
MySQL Workbench 数据库迁移:哪些内容不需要迁移?
kostia
配置管理系统(ConfigManager)设计说明
本文档使用 MrDoc 发布
-
+
首页
at 命令笔记
## 什么是 at? `at` 是一个 Unix-like 系统中用于调度一次性任务的命令。它允许用户指定在未来某一时刻执行命令或脚本,适合临时或单次任务。与周期性任务调度工具(如 Cron)不同,`at` 专注于一次性执行。 ## at 的基本组成 - **atd 服务**:`at` 命令依赖的后台守护进程,负责管理和执行任务队列。 - **任务队列**:每个用户的任务存储在 `/var/spool/at/`,以文件形式保存,文件名包含 job ID。 - **命令格式**:通过 `at` 指定时间和命令,任务在指定时间由 `atd` 执行。 ## at 命令用法 ### 基本命令 - `at <时间>`:调度任务在指定时间执行。 - `atq`:列出当前用户的任务队列(`sudo atq` 查看 `root` 或其他用户任务)。 - `atrm <job_id>`:删除指定任务。 - `at -c <job_id>`:查看任务的详细内容。 ### 时间格式 `at` 支持多种时间格式,包括 24 小时制和 12 小时制(需加 `AM/PM`): - **24 小时制**:`17:00 Apr 22 2025` - **12 小时制**:`5:00 PM Apr 22 2025` - **相对时间**:`now + 2 minutes`, `tomorrow 13:00` - **标准日期**:`MMDDYY`, `MM/DD/YY`, `YYYY-MM-DD` ### 常用示例 1. **调度脚本执行**: ```bash echo "/home/user/script.sh >> /home/user/log.txt 2>&1" | at 5:00 PM Apr 22 2025 ``` - 在 2025 年 4 月 22 日 17:00 执行 `script.sh`,输出重定向到 `log.txt`。 2. **立即测试**: ```bash echo "date >> /home/user/test.log" | at now + 2 minutes ``` - 2 分钟后将当前时间写入 `test.log`。 3. **删除任务**: ```bash atq atrm 1 ``` - 查看队列并删除 job 1。 ## at 任务管理 ### 查看任务 - **当前用户**: ```bash atq ``` 输出格式:`<job_id> <时间> <状态> <用户>`,例如: ``` 9 Tue Apr 22 17:00:00 2025 a li054 ``` - `a` 表示任务等待执行(queued)。 - `li054` 表示任务归属用户。 - **root 用户**: ```bash sudo atq ``` ### 删除任务 - 删除单个任务: ```bash atrm <job_id> ``` - 删除所有任务(当前用户): ```bash atq | awk '{print $1}' | xargs atrm ``` - 删除所有 root 任务: ```bash sudo atq | awk '{print $1}' | xargs sudo atrm ``` ### 检查任务详情 ```bash at -c <job_id> ``` 显示任务的命令、环境变量等。 ## atd 服务管理 - **检查服务状态**: ```bash systemctl status atd ``` - **启动服务**: ```bash sudo systemctl start atd ``` - **启用开机自启**: ```bash sudo systemctl enable atd ``` ## 注意事项 - **权限**: - 普通用户只能管理自己的任务,`sudo` 可管理 `root` 或其他用户任务。 - 使用 `sudo at` 会将任务归属为 `root`,例如: ```bash echo "command" | sudo at 17:00 ``` 任务显示为 `a root`。 - **环境变量**: - `at` 的运行环境比登录 shell 简单,可能缺少 PATH 等变量。 - 建议在脚本中显式指定完整路径,例如 `/usr/bin/date`。 - **日志和错误**: - 任务输出默认发送到用户邮件(`/var/spool/mail/<user>`)。 - 建议重定向输出到文件: ```bash echo "script.sh >> log.txt 2>&1" | at 17:00 ``` - 检查系统日志: ```bash sudo grep atd /var/log/messages ``` - **时间限制**: - `at` 可能无法处理超远未来时间(例如 3125 年),但 2025 年通常没问题。 - 12 小时制需明确 `AM/PM`,否则报错(`garbled time`)。 - **任务存储**: - 任务保存在 `/var/spool/at/`,文件名为 `a<job_id>xxxx`。 - 检查残留任务: ```bash sudo ls -l /var/spool/at/ ``` ## 常见问题排查 1. **任务未执行**: - 检查 `atd` 是否运行: ```bash systemctl status atd ``` - 查看邮件: ```bash cat /var/spool/mail/<user> ``` - 检查脚本权限: ```bash chmod +x script.sh ``` 2. **任务归属错误**: - 使用 `sudo at` 导致任务归属 `root`(显示 `a root`)。 - 以普通用户运行 `at` 归属当前用户(例如 `a li054`): ```bash echo "script.sh" | at 17:00 ``` 3. **已过期任务**: - 执行时间已过的任务自动从队列移除。 - 错误信息可能在邮件或日志中。 ## 与 Cron 的对比 - **at**: - 适合一次性任务。 - 指定具体时间,灵活但无周期性。 - 依赖 `atd` 服务。 - **Cron**: - 适合周期性任务。 - 使用 Crontab 文件配置。 - 最小单位为分钟。 ## 扩展场景 - **Docker 脚本调度**: ```bash echo "/home/user/sync_docker.sh >> /home/user/sync.log 2>&1" | at 5:00 PM tomorrow ``` - 确保用户有 Docker 权限(例如加入 `docker` 组)。 - **清理残留任务**: ```bash sudo find /var/spool/at -type f -name 'a*' -exec rm -v {} \; ```
admin
2025年4月22日 15:18
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
分享
链接
类型
密码
更新密码