返回顶部
c

cron-schedulingcron任务调度

Schedule and manage recurring tasks with cron and systemd timers. Use when setting up cron jobs, writing systemd timer units, handling timezone-aware scheduling, monitoring failed jobs, implementing retry patterns, or debugging why a scheduled task didn't run.

作者: admin | 来源: ClawHub
源自
ClawHub
版本
V 1.0.0
安全检测
已通过
8,230
下载量
免费
免费
7
收藏
概述
安装方式
版本历史

cron-scheduling

Cron & Scheduling

安排和管理重复性任务。涵盖cron语法、crontab管理、systemd定时器、一次性调度、时区处理、监控和常见故障模式。

何时使用

  • - 按计划运行脚本(备份、报告、清理)
  • 设置systemd定时器(现代cron替代方案)
  • 调试计划任务未运行的原因
  • 处理计划任务中的时区问题
  • 监控和告警任务失败
  • 运行一次性延迟命令

Cron语法

五个字段

┌───────── 分钟 (0-59)
│ ┌─────── 小时 (0-23)
│ │ ┌───── 日 (1-31)
│ │ │ ┌─── 月 (1-12 或 JAN-DEC)
│ │ │ │ ┌─ 星期 (0-7, 0和7=星期日, 或 SUN-SAT)
│ │ │ │ │

  • * 命令

常见调度

bash

每分钟执行


  • * /path/to/script.sh

每5分钟执行

/5 * /path/to/script.sh

每小时整点执行

0 /path/to/script.sh

每天凌晨2:30执行

30 2 * /path/to/script.sh

每周一上午9:00执行

0 9 1 /path/to/script.sh

每个工作日早上8:00执行

0 8 1-5 /path/to/script.sh

每月第一天午夜执行

0 0 1 /path/to/script.sh

工作时间内每15分钟执行(周一至周五9-17点)

/15 9-17 * 1-5 /path/to/script.sh

每天两次(上午9点和下午5点)

0 9,17 * /path/to/script.sh

每季度执行(1月、4月、7月、10月)第一天午夜

0 0 1 1,4,7,10 * /path/to/script.sh

每周日凌晨3点执行

0 3 0 /path/to/script.sh

特殊字符串(简写)

bash
@reboot /path/to/script.sh # 启动时运行一次
@yearly /path/to/script.sh # 0 0 1 1 *
@monthly /path/to/script.sh # 0 0 1
@weekly /path/to/script.sh # 0 0 0
@daily /path/to/script.sh # 0 0 *
@hourly /path/to/script.sh # 0

Crontab管理

bash

编辑当前用户的crontab


crontab -e

列出当前crontab

crontab -l

编辑其他用户的crontab(root权限)

sudo crontab -u www-data -e

删除所有cron任务(小心操作!)

crontab -r

从文件安装crontab

crontab mycrontab.txt

备份crontab

crontab -l > crontab-backup-$(date +%Y%m%d).txt

Crontab最佳实践

bash

显式设置PATH(cron的PATH最小)


PATH=/usr/local/bin:/usr/bin:/bin

设置MAILTO用于错误通知

MAILTO=admin@example.com

显式设置shell

SHELL=/bin/bash

完整crontab示例

PATH=/usr/local/bin:/usr/bin:/bin MAILTO=admin@example.com SHELL=/bin/bash

备份

0 2 * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1

清理旧日志

0 3 0 find /var/log/myapp -name *.log -mtime +30 -delete

健康检查

/5 * /opt/scripts/healthcheck.sh || /opt/scripts/alert.sh 健康检查失败

Systemd定时器

创建定时器(现代cron替代方案)

ini

/etc/systemd/system/backup.service


[Unit]
Description=每日备份

[Service]
Type=oneshot
ExecStart=/opt/scripts/backup.sh
User=backup
StandardOutput=journal
StandardError=journal

ini

/etc/systemd/system/backup.timer


[Unit]
Description=每天凌晨2点运行备份

[Timer]
OnCalendar=--* 02:00:00
Persistent=true
RandomizedDelaySec=300

[Install]
WantedBy=timers.target

bash

启用并启动定时器


sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer

检查定时器状态

systemctl list-timers systemctl list-timers --all

检查上次运行

systemctl status backup.service journalctl -u backup.service --since today

手动运行(用于测试)

sudo systemctl start backup.service

禁用定时器

sudo systemctl disable --now backup.timer

OnCalendar语法

ini

Systemd日历表达式

每天午夜

OnCalendar=daily

或:OnCalendar=--* 00:00:00

每周一上午9点

OnCalendar=Mon --* 09:00:00

每15分钟

OnCalendar=*:0/15

工作日早上8点

OnCalendar=Mon..Fri --* 08:00:00

每月第一天

OnCalendar=--01 00:00:00

每6小时

OnCalendar=0/6:00:00

特定日期

OnCalendar=2026-02-03 12:00:00

测试日历表达式

systemd-analyze calendar Mon --* 09:00:00 systemd-analyze calendar *:0/15 systemd-analyze calendar --iterations=5 Mon..Fri --* 08:00:00

相比cron的优势

Systemd定时器 vs cron:
+ 日志记录在journald中(journalctl -u service-name)
+ 持久化:重启后能补上错过的运行
+ RandomizedDelaySec:防止惊群效应
+ 依赖关系:可以依赖网络、挂载等
+ 资源限制:CPUQuota、MemoryMax等
+ 无丢失邮件问题(MAILTO经常配置错误)

  • - 需要创建更多文件(service + timer)
  • 配置更冗长

一次性调度

at(在特定时间运行一次)

bash

调度命令


echo /opt/scripts/deploy.sh | at 2:00 AM tomorrow
echo reboot | at now + 30 minutes
echo /opt/scripts/report.sh | at 5:00 PM Friday

交互模式(输入命令,Ctrl+D结束)

at 10:00 AM

/opt/scripts/task.sh
echo 完成 | mail -s 任务完成 admin@example.com

列出待处理任务

atq

查看任务详情

at -c <任务编号>

删除任务

atrm <任务编号>

基于sleep(最简单)

bash

延迟后运行


(sleep 3600 && /opt/scripts/task.sh) &

使用nohup(退出登录后继续运行)

nohup bash -c sleep 7200 && /opt/scripts/task.sh &

时区处理

bash

Cron默认使用系统时区运行


检查系统时区


timedatectl
date +%Z

为特定cron任务设置时区

方法1:在crontab中使用TZ变量

TZ=America/New_York 0 9 * /opt/scripts/report.sh

方法2:在脚本中设置

#!/bin/bash export TZ=UTC

所有日期操作现在使用UTC

方法3:包装器

TZ=Europe/London date +%Y-%m-%d %H:%M:%S

列出可用时区

timedatectl list-timezones timedatectl list-timezones | grep America

夏令时陷阱

问题:在夏令时转换期间,安排在凌晨2:30的任务可能运行两次或根本不运行。

春季向前:凌晨2:30不存在(时钟从2:00跳到3:00)
秋季回退:凌晨2:30出现两次

缓解措施:

  1. 1. 将关键

标签

skill ai

通过对话安装

该技能支持在以下平台通过对话安装:

OpenClaw WorkBuddy QClaw Kimi Claude

方式一:安装 SkillHub 和技能

帮我安装 SkillHub 和 cron-scheduling-1776365861 技能

方式二:设置 SkillHub 为优先技能安装源

设置 SkillHub 为我的优先技能安装源,然后帮我安装 cron-scheduling-1776365861 技能

通过命令行安装

skillhub install cron-scheduling-1776365861

下载

⬇ 下载 cron-scheduling v1.0.0(免费)

文件大小: 4.86 KB | 发布时间: 2026-4-17 15:40

v1.0.0 最新 2026-4-17 15:40
Initial release: Cron syntax, crontab management, systemd timers, at/one-off jobs, timezone/DST handling, job monitoring, locking, idempotent patterns

Archiver·手机版·闲社网·闲社论坛·羊毛社区· 多链控股集团有限公司 · 苏ICP备2025199260号-1

Powered by Discuz! X5.0   © 2024-2025 闲社网·线报更新论坛·羊毛分享社区·http://xianshe.com

p2p_official_large
返回顶部