在前边的内容中,我们先后掌握了crontab的基础与高级用法,以及anacron的补执行机制——它们的核心作用都是「循环执行定时任务」:crontab用于7x24小时服务器的精准循环定时,anacron用于解决关机错过的循环任务补执行。
但实际工作中,我们常会遇到「一次性定时任务」的需求:比如“今晚23点执行一次数据库备份”“明天早上8点自动重启服务器”“10分钟后执行一个脚本清理临时文件”。
这种“执行一次就失效”的任务,用crontab或anacron就显得“大材小用”,甚至会因为忘记删除循环任务而导致重复执行、引发故障。而Linux自带的at命令,正是为一次性定时任务而生,简单、高效、用完即走,今天这篇就手把手教你吃透它的用法,看完就能上手实操。
一、先搞懂:at命令与crontab的核心区别(避免用错场景)
很多初学者会混淆at和crontab,其实两者的核心差异就在于「任务执行次数」,用一张表格就能快速区分,再也不踩错:
| | |
|---|
| | |
| 临时、一次性任务(如定时重启、单次备份、延迟执行) | |
| 支持精准到分钟(如10:30执行)、延迟执行(如10分钟后) | |
| | |
| | |
一句话总结:循环任务用crontab/anacron,一次性任务用at,两者互补,覆盖所有定时任务场景。
二、前置准备:确认atd服务已启动(必做,否则任务无效)
at命令的执行依赖atd服务(at daemon),如果atd服务未启动,无论创建多少at任务,都不会按时执行。这是初学者最容易踩的坑,一定要先检查并启动服务。
1. 检查atd服务状态
# 查看atd服务状态(CentOS/Ubuntu通用)systemctl status atd
✅ 正常状态:输出中包含「active (running)」,说明服务已启动,可直接使用at命令;
❌ 异常状态:输出中包含「inactive (dead)」,说明服务未启动,需执行启动命令。
2. 启动/重启atd服务(并设置开机自启)
# 启动atd服务systemctl start atd# 重启atd服务(修改配置后需重启)systemctl restart atd# 设置开机自启(避免重启服务器后atd服务失效)systemctl enable atd# 再次检查状态,确认启动成功systemctl status atd
⚠️ 注意:容器环境或最小化安装的Linux系统,可能未安装atd服务,需先安装:
# CentOS/Rocky Linux 安装atdyum install at -y# Ubuntu/Debian 安装atdapt install at -y
三、at命令基础用法:创建、查看、删除(核心,必掌握)
at命令的用法非常简洁,核心只有3个操作:创建任务、查看任务、删除任务,下面结合实例逐一讲解,所有命令均可直接复制执行。
1. 核心语法(快速参考)
# 基本语法at [选项] 时间# 常用选项-f :指定要执行的脚本文件(批量执行命令时用)-l :查看当前所有待执行的at任务(等价于atq命令)-d :删除指定ID的at任务(等价于atrm命令)-v :查看任务时,显示任务的执行时间(更直观)
2. 第一步:创建at任务(最常用,3种场景全覆盖)
创建at任务有两种方式:交互模式(手动输入命令)和脚本模式(执行提前写好的脚本),根据需求选择即可。
场景1:交互模式(简单命令,快速创建)
适合执行1-2条简单命令(如重启服务、创建文件),步骤:输入at + 时间 → 输入要执行的命令 → 按Ctrl+D结束输入(确认创建)。
# 示例1:指定具体时间执行(今天18:30执行,创建一个测试文件)at 18:30# 输入命令后按Enter,再按Ctrl+D结束touch /tmp/at_test.txt# 结束后会提示:job 1 at Wed Apr 9 18:30:00 2026(job 1是任务ID,后续管理用)# 示例2:延迟执行(10分钟后执行,清理/tmp目录下的临时文件)at now + 10 minutes# 输入命令rm -rf /tmp/*.tmp# 按Ctrl+D结束,提示:job 2 at Wed Apr 9 16:40:00 2026
场景2:脚本模式(多命令/复杂任务,推荐)
如果需要执行多个命令(如备份数据库+发送邮件),建议先写好脚本,再用at命令指定脚本执行时间,避免交互模式输入错误。
# 1. 先编写脚本(示例:一次性数据库备份脚本)vim /usr/local/scripts/onekey_backup.sh# 脚本内容(可直接复制,修改数据库信息即可)#!/bin/bash# 一次性MySQL备份脚本BACKUP_DIR=/var/backup/mysqlDATE=$(date +%Y%m%d%H%M%S)# 创建备份目录(不存在则创建)mkdir -p $BACKUP_DIR# 执行备份(替换为自己的数据库账号密码)mysqldump -u root -p123456 test_db > $BACKUP_DIR/test_db_$DATE.sql# 备份完成后输出日志echo"MySQL备份完成,备份文件:$BACKUP_DIR/test_db_$DATE.sql" >> /var/log/at_backup.log# 2. 给脚本添加执行权限chmod +x /usr/local/scripts/onekey_backup.sh# 3. 用at命令指定明天0点执行该脚本at -f /usr/local/scripts/onekey_backup.sh 00:00 tomorrow# 提示:job 3 at Thu Apr 10 00:00:00 2026(任务创建成功)
场景3:常用时间格式(必记,避免踩坑)
at命令支持多种时间格式,灵活适配不同需求,记住以下几种最常用的即可:
- 具体时间:
at 10:30(今天10:30执行)、at 23:00 2026-04-10(指定日期时间执行); - 延迟执行:
at now + 5 minutes(5分钟后)、at now + 1 hour(1小时后)、at now + 2 days(2天后); - 模糊时间:
at noon(今天中午12点)、at midnight(今天午夜0点)、at tomorrow(明天当前时间)。
3. 第二步:查看at任务(确认任务是否创建成功)
创建任务后,可通过两种命令查看当前待执行的at任务,推荐用 at -l(更简洁),或 atq(等价命令)。
# 查看所有at任务(最常用)at -l# 输出示例(第一列是任务ID,第二列是执行时间,第三列是创建任务的用户)1 Wed Apr 9 18:30:00 2026 aaron2 Wed Apr 9 16:40:00 2026 aaron3 Thu Apr 10 00:00:00 2026 aaron# 查看任务详情(显示任务要执行的具体命令)at -c 任务ID# 示例:查看ID为3的任务详情at -c 3# 查看任务时,显示更直观的执行时间at -v -l
⚠️ 注意:任务执行完毕后,会自动从任务列表中消失,无需手动删除。
4. 第三步:删除at任务(任务不需要执行时)
如果创建的任务不需要执行(如计划变更),可通过任务ID删除,用 at -d 任务ID或 atrm 任务ID(两种命令等价)。
# 查看任务ID(先确认要删除的任务ID)at -l# 删除ID为2的任务(两种方式均可)at -d 2# 或atrm 2# 再次查看,确认任务已删除at -l
四、进阶:at队列与权限控制(避免任务混乱、越权)
当多人使用同一台服务器时,可能会创建大量at任务,此时需要了解「队列」和「权限控制」,避免任务冲突、越权执行。
1. at队列:分类管理任务(可选,提升效率)
at任务默认会放入「a队列」(默认队列),我们可以通过指定队列(字母a-z)来分类管理任务(如备份任务放b队列、重启任务放c队列),方便区分和管理。
# 语法:at -q 队列字母 时间# 示例1:将备份任务放入b队列,明天0点执行at -q b -f /usr/local/scripts/onekey_backup.sh 00:00 tomorrow# 示例2:将重启任务放入c队列,10分钟后执行at -q c now + 10 minutesreboot# 按Ctrl+D结束# 查看指定队列的任务(-q 队列字母)at -q b -l# 删除指定队列的任务(还是用任务ID,队列不影响删除)at -d 4
💡 实用技巧:队列字母无特殊含义,可按自己的习惯分类(如a=日常任务、b=备份任务、c=系统任务),适合多人协作或任务较多的场景。
2. 权限控制:限制用户使用at命令
Linux通过两个配置文件控制用户使用at命令的权限,默认允许所有用户使用,可根据需求限制(如禁止普通用户创建at任务)。
/etc/at.allow:白名单文件,仅允许文件中列出的用户使用at命令(优先级高);/etc/at.deny:黑名单文件,禁止文件中列出的用户使用at命令(默认存在,为空时允许所有用户)。
# 示例1:仅允许root和aaron用户使用at命令(创建白名单)echo"root" > /etc/at.allowecho"aaron" >> /etc/at.allow# 此时其他用户执行at命令会提示权限不足# 示例2:禁止test用户使用at命令(添加到黑名单)echo"test" >> /etc/at.deny# 注意:如果同时存在at.allow和at.deny,at.deny会被忽略
五、实战演练:2个高频场景,直接套用
结合实际工作中的高频需求,编写2个实战案例,所有命令均可直接复制执行,新手也能快速上手。
实战1:定时重启服务器(一次性)
场景:服务器需要更新配置,计划明天凌晨3点重启一次,重启后无需重复执行。
# 1. 查看atd服务是否启动(必做)systemctl status atd# 2. 创建at任务,明天凌晨3点重启服务器at 03:00 tomorrow# 输入重启命令reboot# 按Ctrl+D结束,提示任务创建成功# 3. 查看任务,确认无误at -l# 4. 若计划变更,删除任务(假设任务ID为5)# at -d 5
实战2:定时执行一次性脚本(备份+日志)
场景:今天22点执行一次系统备份脚本,备份系统重要文件,并记录日志,执行完毕后任务自动失效。
# 1. 编写系统备份脚本vim /usr/local/scripts/system_backup.sh# 脚本内容#!/bin/bash# 一次性系统备份脚本BACKUP_DIR=/var/backup/systemDATE=$(date +%Y%m%d%H%M%S)# 创建备份目录mkdir -p $BACKUP_DIR# 备份/etc目录(系统核心配置)tar -zcvf $BACKUP_DIR/etc_backup_$DATE.tar.gz /etc# 备份完成后记录日志echo"系统/etc目录备份完成,时间:$DATE,备份文件:$BACKUP_DIR/etc_backup_$DATE.tar.gz" >> /var/log/system_backup.log# 2. 给脚本添加执行权限chmod +x /usr/local/scripts/system_backup.sh# 3. 用at命令指定今天22点执行该脚本at -f /usr/local/scripts/system_backup.sh 22:00# 4. 查看任务,确认创建成功at -l# 5. 任务执行后,查看日志确认结果cat /var/log/system_backup.log
六、常见问题与避坑指南(新手必看)
整理了初学者使用at命令时最容易遇到的5个问题,以及对应的解决方法,避免踩坑浪费时间。
- 问题1:创建at任务后,到时间不执行? 解决:① 检查atd服务是否启动(
systemctl status atd),未启动则启动;② 检查任务时间是否正确(避免设置过去的时间);③ 检查命令/脚本是否有执行权限。 - 问题2:执行at任务时,提示“权限不足”? 解决:检查是否被
/etc/at.deny拉黑,或未在 /etc/at.allow白名单中;切换root用户重试,或修改权限配置文件。 - 问题3:at任务执行后,没有预期效果(如文件未创建)? 解决:命令尽量使用绝对路径(如用
/bin/touch而非 touch),避免at环境变量不足导致命令无法找到;可通过 at -c 任务ID查看任务详情,排查命令错误。 - 问题4:如何查看at任务的执行日志? 解决:at任务的执行日志默认记录在系统日志中,CentOS查看
/var/log/cron,Ubuntu查看 /var/log/syslog,用 grep "atd" /var/log/cron过滤日志。 - 问题5:at任务执行时,终端关闭会影响任务吗? 解决:不会。at任务是后台执行的,与终端无关,即使关闭终端,任务也会按时执行(前提是atd服务正常运行)。
七、总结与系列延伸
今天我们吃透了Linux at命令的核心用法,它是一次性定时任务的“最佳工具”,用法简单、高效,完美弥补了crontab/anacron在一次性任务场景的不足,核心要点总结:
- 核心定位:用于执行一次性定时任务,执行完毕后自动失效,适合临时、单次的任务需求;
- 核心操作:创建(
at 时间)、查看(at -l)、删除(at -d 任务ID),3步搞定; - 关键前提
- 实用技巧:复杂任务用脚本模式(
at -f 脚本路径),多任务用队列分类,权限控制用allow/deny文件。
如果你觉得本文对你有帮助,欢迎点赞、推荐、转发,关注我,后续会分享更多Linux入门干货!
文 / 零距技术仓记录每一次真实的折腾 (#^.^#)🚀 想看到更多实用折腾技巧?👉 先关注💬 评论区说说你的经历或想看的内容👍 点赞表示支持🔁 顺手分享给也在折腾的人,让大家都少踩坑 😎