Linux 中的定时任务主要靠 cron 系统实现,而 crontab 是管理用户级定时任务的核心命令。注意:没有标准的 at 命令与 crontab 混用为“crontabat” ——这是常见误解。at 用于**一次性**延时任务,crontab 用于**周期性**重复任务,二者机制不同、配置独立。
每个用户(包括 root)都有自己的 crontab 文件,通过 crontab -e 编辑,内容按固定时间格式定义任
务执行计划。
30 2 * * * /backup.sh 表示每天凌晨 2:30 执行脚本0 9-17/2 * * 1-5 表示工作日每两小时(9、11、13、15、17 点)整点运行crontab -l 查看,crontab -r 清空(慎用)at 适合执行一次性的未来任务,比如“今晚 23:00 关机”或“10 分钟后发邮件”。它不依赖 cron 守护进程持续调度,而是由 atd 后台服务管理队列。
atd 已启用:sudo systemctl enable --now atd
at 23:00 回车后,进入交互模式,输入要执行的命令(如 shutdown -h now),按 Ctrl+D 结束atq;取消某任务:atrm [job_id]
at 默认使用用户当前 shell 环境,但不读取 ~/.bashrc 等文件,复杂命令建议封装为脚本并用绝对路径调用定时任务“看似添加成功却没运行”是高频痛点,多数源于环境差异或权限配置。
systemctl status cron(Debian/Ubuntu)或 systemctl status crond(RHEL/CentOS)grep CRON /var/log/syslog(Ubuntu)或 journalctl -u cron -n 20
* * * * * /path/to/script.sh >> /tmp/script.log 2>&1
env -i /bin/sh 模拟最小环境再执行命令不当配置可能引发权限泄露或系统负载异常,尤其在生产环境中需谨慎。
chmod 600)flock):* * * * * flock -n /tmp/myjob.lock -c "/path/to/script.sh"
for user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user -l 2>/dev/null; done