at用于一次性任务,crontab用于周期性任务;at支持秒级精度和自然语言时间,crontab依赖五字段格式且最小单位为分钟;at任务存于/var/spool/at/并受at.allow/deny控制,crontab规则存于/var/spool/cron/或/etc/crontab,权限由cron.deny管理;atd服务可补跑关机未执行任务,crond则不回补跳过的任务。

Linux 中的 at 和 crontab 都能安排命令在未来执行,但它们解决的是两类完全不同的调度需求:一个是“只做一次”,一个是“反复去做”。选错工具不仅任务跑不起来,还可能让运维逻辑混乱。
任务性质与执行频次
at 专为一次性任务设计,比如“10分钟后重启服务”或“8月30日早上9点记录当前时间”。任务触发后自动从队列清除,不会再次运行。
crontab 则面向周期性场景,如“每天凌晨4点备份日志”或“每5分钟检测端口状态”。只要规则存在,就会按设定频率持续触发。
配置方式与时间精度
at 使用自然语言式时间描述,支持秒级精度(例如 at now + 45 seconds),输入后进入交互编辑界面写命令,操作轻量;
crontab 依赖固定五字段格式(分 时 日 月 周),最小单位是分钟,不支持秒——若需秒级轮询,得靠脚本内部 sleep 或改用 systemd timer。
存储位置与权限控制
at 任务存放在 /var/spool/at/,每个任务独立文件,仅对提交用户可见;可通过 /etc/at.allow(白名单)或 /etc/at.deny(黑名单)限制使用权限。
crontab 规则默认保存在 /var/spool/cron/用户名,root 还可编辑系统级配置 /etc/crontab 或 /etc/cron.d/ 下的文件,权限由 cron.deny 控制。
服务依赖与异常处理
at 依赖 atd 服务,若系统关机时任务未执行,开机后 atd 会立即补跑;
crontab 依赖 crond 服务,同样具备断电续跑能力,但只在 crond 每分钟扫描时检查——若某次该分钟内系统关机,对应任务就跳过了,不会回补(anacron 可弥补这点,但非 crond 本体功能)。











