资讯动态

定时任务crontab,at,systemd timer

发布时间:2026/10/14 16:26:20 来源:尧图企业网站定制
一、crontab周期性定时任务常用命令crontab -e # 编辑当前用户的定时任务 crontab -l # 查看当前用户的定时任务 crontab -r # 删除当前用户所有定时任务慎用 crontab -u 用户名 -l # 查看指定用户的任务需 root时间格式* * * * * 要执行的命令 │ │ │ │ │ │ │ │ │ └── 星期 (0-7, 0和7都表示周日) │ │ │ └──── 月 (1-12) │ │ └────── 日 (1-31) │ └──────── 时 (0-23) └────────── 分 (0-59)常见示例# 每分钟执行 * * * * * /path/to/script.sh # 每天凌晨 2 点执行 0 2 * * * /path/to/script.sh # 每 5 分钟执行 */5 * * * * /path/to/script.sh # 每周一 9:30 执行 30 9 * * 1 /path/to/script.sh # 每月 1 号 0 点执行 0 0 1 * * /path/to/script.sh实用技巧# 输出日志排查问题必备 0 2 * * * /path/to/script.sh /var/log/task.log 21 # 指定 shell 和环境变量crontab 环境变量很少建议脚本里写全路径 SHELL/bin/bash PATH/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin注意crontab 里命令必须用绝对路径且环境变量与登录 shell 不同很多“手动能跑、定时不跑”都是这个原因。二、at一次性定时任务at用于一次性定时任务执行完就结束不像 cron 那样重复。下面按“安装 → 使用 → 查看 → 删除”的顺序讲清楚。一、安装与启动服务很多系统默认没装at需要先安装# Debian/Ubuntu sudo apt install at # CentOS/RHEL sudo yum install at # 启动并设置开机自启 sudo systemctl enable --now atd二、创建一次性任务方式一交互式输入最常用at 02:00回车后会进入at提示符输入要执行的命令最后按CtrlD结束at /usr/local/bin/backup.sh at echo done /var/log/at.log at CtrlD # 按 CtrlD 提交提交后会显示任务编号例如job 3 at Tue Oct 13 02:00:00 2026。方式二管道直接传入echo /usr/local/bin/backup.sh | at 02:00方式三从脚本文件读取at 02:00 -f /path/to/script.sh三、时间写法非常灵活at 02:00 # 今天凌晨 2 点若已过则为明天 at 14:30 # 今天下午 2:30 at now 10 minutes # 10 分钟后 at now 2 hours # 2 小时后 at now 3 days # 3 天后 at 10:00 tomorrow # 明天 10 点 at 09:00 Mon # 下周一 9 点 at midnight # 今天午夜 at teatime # 下午 4 点 at 2026-12-31 23:59 # 指定日期时间四、查看待执行任务at -l # 列出当前用户的待执行任务等价于 atq atq # 同上输出示例3 Tue Oct 13 02:00:00 2026 a user3任务编号a队列名称user所属用户查看 root 的所有任务sudo atq查看任务具体内容at -c 3 # 查看编号为 3 的任务的完整命令五、删除任务at -r 3 # 删除编号为 3 的任务 atrm 3 # 同上六、权限控制at有白名单和黑名单机制/etc/at.allow # 白名单只有列出的用户能用 at /etc/at.deny # 黑名单列出的用户不能用 at规则若at.allow存在只有其中用户可用at.deny被忽略。若at.allow不存在则检查at.deny其中用户被禁止。两者都不存在通常只有 root 能用。七、常见问题1. 任务执行了但命令没生效at的环境变量极少和登录 shell 不同。建议命令用绝对路径在脚本里写全PATH需要输出日志时显式重定向例如 /var/log/at.log 21。2. 输出会发邮件at默认把命令的 stdout/stderr 通过邮件发给用户。若系统没配邮件可能报错。建议显式重定向到日志文件。3. 想确认任务是否执行成功journalctl -u atd # 查看 atd 服务日志三、systemd timer更现代的方案1. 创建任务文件以每日备份为例你需要创建两个同名的单元文件放在/etc/systemd/system/目录下。第一步创建 service 文件定义“做什么”文件名backup.service[Unit] DescriptionDaily backup task [Service] Typeoneshot # 注意ExecStart 必须使用绝对路径 ExecStart/usr/local/bin/backup.shTypeoneshot表示任务执行完就退出这是定时任务最常用的类型。第二步创建 timer 文件定义“何时做”文件名backup.timer[Unit] DescriptionRun backup daily [Timer] # 每天凌晨 3:00 触发 OnCalendar*-*-* 03:00:00 # 如果系统在任务时间点处于关机状态开机后立即补跑 Persistenttrue [Install] WantedBytimers.targettimer 会自动关联同名的.service文件无需手动指定。2. 启用并启动每次修改或新建单元文件后都必须执行daemon-reload# 1. 重新加载 systemd 配置 sudo systemctl daemon-reload # 2. 启用并立即启动 timer注意是启动 .timer不是 .service sudo systemctl enable --now backup.timer3. 查看状态与日志这是 systemd timer 相比 cron 最大的优势之一日志被自动记录排查问题非常方便。# 查看所有定时器的下一次触发时间 systemctl list-timers --all # 查看 timer 本身的状态是否已启用、下次运行时间 systemctl status backup.timer # 【关键】查看任务实际执行的结果和日志 journalctl -u backup.service # 实时跟踪日志输出 journalctl -u backup.service -f常用时间写法参考在OnCalendar中你可以使用类似 cron 但更直观的语法需求写法每分钟OnCalendar*:*:00每 5 分钟OnCalendar*:0/5每天 3:30OnCalendar*-*-* 03:30:00每周一 9:00OnCalendarMon *-*-* 09:00:00工作日 2:00OnCalendarMon..Fri *-*-* 02:00:00

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑