侧边栏壁纸
  • 累计撰写 84 篇文章
  • 累计创建 35 个标签
  • 累计收到 1 条评论

目 录CONTENT

linux定时任务之System timer

天明
2024-01-09 / 0 评论 / 0 点赞 / 26 阅读 / 2481 字 / 正在检测是否收录...

systemd系统中包含了timer计时器组件,timer可以完全替代cron+at

管理命令

systemctl list-timers
# NEXT表示下一次要触发定时任务的时间点
# LEFT表示现在距离下次执行任务还剩多长时间
# LAST表示上次触发定时任务的时间点
# PASSED表示距离上一次执行任务已经过去多久
# UNIT表示是哪个定时器
# ACTIVATES表示该定时器所触发的任务
systemctl status xxx.timer
systemctl stop xxx.timer
systemctl restart xxx.timer
systemctl enable xxx.timer
# 查看日志
journalctl -u xxx.service

systemd timer入门示例

文件存储在:/usr/lib/systemd/system 或/etc/systemd/system

  • 编写xx.timer文件描述定时任务如何定时
  • 编写xx.service文件描述定时任务要执行的操作
# backup-etcd.service
[Unit]
Description=Backup ETCD
[Service]
Type=oneshot
MemoryLimit=20M # 或引入slice文件
Slice=etcd-backup.slice
ExecStart=/usr/local/bin/kube-scripts/etcd-backup.sh

# etcd-backup.slice
[Unit]
Description=Limited resources Slice
DefaultDependencies=no
Before=slices.target
[Slice]
CPUQuota=50%
MemoryLimit=20M

# backup-etcd.timer
[Unit]
Description=Timer to backup ETCD
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=yes # 只在使用了OnCalendar时有效,默认值no。设置yes时,会将上次执行任务的时间点保存在磁盘上,使得定时器再次被启动时,可以立即判断是否要执行丢失的任务,即处理因过期未执行的任务
# 这5个位置分别表示分 时 日 月 周
# OnActiveSec=1s # 启动后多长时间触发
# OnUnitInactiveSec=3s # 上一次任务退出后多长时间触发
# AccuracySec=1ms # 触发事件后,允许推迟多长时间再执行被触发的任务,即下一次任务为OnUnitInactiveSec到OnUnitInactiveSec+AccuracySec内触发,集中同一时间执行
# RandomizedDelaySec=0 # 触发定时任务后还需延迟一个指定范围内的随机时长才执行任务。该指令默认值为0,避免同一时间执行
Unit=backup-etcd.service
[Install]
WantedBy=multi-user.target

OnCalendar示例

*:00           -> 每小时,省略秒位
*:*            -> 每分钟,省略秒位
*:*:*          -> 每秒
*-*-01 00:00   -> 每月一号,省略秒位
9..17/2:00     -> 从上午9点开始每隔两小时,直到下午5点
12..14:10,20   -> 12到14点的第10分钟和第20分钟,即1[234]:[12]0:00

cron和systemd timer实现定时任务的比较

Linux环境下,cron是使用最广泛的定时任务工具,但它有一些不方便的地方。比如它默认:

  • 只支持分钟级别精度的定时任务
  • 定时规则太死板
  • 当调度到本次任务时,如果上次调度的任务仍在执行,无法阻止本次任务重复执行(需结合flock)
  • 无法对定时任务可能消耗的大量资源做出限制
  • 不支持只执行一次的定时点的计划任务
  • 日志不直观,不方便调试任务

systemd timer特性(步骤复杂些)

  • 可精确到微妙级别,其支持的时间单位包括:us(微秒)、ms(毫秒)、s(秒)、m(分)、h(时)、d(日)、w(周)
  • 类似cron定义时间的方式(某年某月某日某时某分某秒以及时间段)
  • 可对定时任务做资源限制
  • 可替代cron和at工具,且支持比cron更加灵活丰富的定时规则
  • 不会重复执行定时任务
  • 如果触发定时任务时发现上次触发的任务还未执行完,那么本次触发的任务不会执行
  • 而且systemd启动服务的操作具有幂等性,如果服务正在运行,启动操作将不做任何事,所以,甚至可以疯狂到每秒或每几秒启动一次服务,免去判断进程是否存在的过程
  • 集成到journal日志,方便调试任务,方便查看任务调度情况
0

评论区