怎么使用systemd timer替代cronjob


今天小编给大家分享一下怎么使用systemdtimer替代cronjob的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前几天在使用 Terraform + cloud-init 批量初始化我的实验室 Linux 机器。正好发现有一些定时场景需要使用到 cronjob, 进一步了解到 systemd timer 完全可以替换 cronjob, 并且 systemd timer 有一些非常有趣的功能。回归话题:为什么我推荐你使用 systemd timer 替代 cronjob? 因为相比 cronjob, systemd timer 有这些优势:可以覆盖 cronjob 的所有功能统一日志收集到 systemd 日志针对时间精确度更详细的配置项除了定时场景,还支持基于 event 的触发相比 cronjob 更灵活的语法更丰富的使用/运维命令集接下来我们一一介绍。首先我们通过系统自带的 timer 来熟悉这个新玩意。当 Ubuntu 或任何基于 systemd 的发行版安装在一个新系统上时,它会创建几个 timer,作为任何 Linux 主机后台的系统维护程序的一部分。这些 timer 会触发普通维护任务所需的事件,比如更新系统数据库、清理临时目录、切割日志文件等等。我们使用systemctl status *timer命令列出我的主机上的所有 timer:每个 timer 至少有六行信息与之相关:第一行是 timer 的文件名和对其用途的简短描述。第二行显示 timer 的状态,它是否被加载,timer unit 文件的完整路径,以及供应商的预设。第三行显示其活动状态,包括 timer 开始活动的日期和时间。第四行包含 timer 下次被触发的日期和时间,以及直到触发发生的大致时间。第五行显示由 timer 触发的事件或服务的名称。一些(但不是全部)systemd unit 文件有指向相关文档的指针。如上面的 Docs: man:fstrim最后一行是 timer 所触发的服务的最新实例的日志条目。优势之一:统一日志收集到 systemd 日志为了更快了解 timer, 我们创建自己的 service unit 和 timer unit 来触发。具体用途为:每周定期更新 tailscale 的版本。首先,创建 tailscale update 服务,如下:然后,创建 tailscale update timer, 如下:最后,启用 timer:这样就可以了,但是为了演示,执行:systemctl start tailscale-weekly-update.service 手动运行一次。输出会直接集成到 systemd 日志里,并可以通过 journalctl 查看:(包含手动执行日志,和后续自动定期执行的日志)如上面的日志,可以很方便地检查 timer 和服务的状态。在日志这方面,你不需要做任何特别的事情,就可以使tailscale-weekly-update.service unit 中的ExecStart触发器的STDOUT存储在日志中。这都是使用 systemd 运行服务的一部分。优势之一:针对时间精确度更详细的配置项从上面日志,如果细看,timer 不会在:00秒的时候准确触发,甚至不会在上一个实例的一分钟内准确触发。这是故意的,但如果有必要的话,可以覆盖它的默认配置。这种行为的原因是为了防止多个服务在完全相同的时间被触发。例如,你可以使用时间规格,如每周、每天,等等。这些快捷方式都被定义为在它们被触发的那一天的 00:00:00 时触发。当多个 timer 被这样指定时,它们很有可能会试图同时启动。systemd timer 被有意设计成在指定时间内随机触发,以防止同时触发。它们在一个时间窗口内半随机地触发。根据systemd.timer手册,这个触发时间相对于所有其他定义的 timer 单位来说,保持在一个稳定的位置。大多数时候,这种概率性的触发时间是没有问题的。当安排备份等任务运行时,只要它们在非工作时间运行,就不会有问题。一个系统管理员可以选择一个确定的开始时间,如典型的 cronjob 规范中的 01:05:00,以不与其他任务冲突,但有很大范围的时间值可以达到这个目的。启动时间中的一分钟随机性通常是不相关的。然而,对于某些任务,精确的触发时间是一个绝对要求。对于这些任务,你可以通过在 timer unit 文件的 Timer 部分添加这样的配置来指定更高的触发时间跨度精度(如精度在一微秒内):时间跨度可用于指定所需的精度,以及为重复性或一次性事件定义时间跨度。它可以识别以下单位:usec, us, smsec, msseconds, second, sec, sminutes, minute, min, mhours, hour, hr, hdays, day, dweeks, week, wmonths, month, M (定义为 30.44 天)years, year, y (定义为 365.25 天)/usr/lib/systemd/system中的所有默认 timer 都指定了一个更大的精度范围,因为精确的时间并不关键。看看系统创建的 timer 中的一些规格:优势之一:除了定时场景,还支持基于 event 的触发systemd timer 具有 cron 所不具备的其他功能,cron 只在特定的、重复的、实时的日期和时间触发。但是,一个 timer 可以被配置为在系统启动后,或在启动后,或在某个定义的服务 unit 激活后的特定时间内触发。这些被称为单调性 timer。单调指的是一个持续增加的计数或序列。这些 timer 不是持久的,因为它们在每次启动后都会重置。表 1 列出了单调的 timer 以及每个 timer 的简短定义,还有 “OnCalendar” timer,它不是单调的,用于指定未来的时间,可能是重复的,也可能不是。表 1: systemd timer 定义单调 timer 的时间跨度可以使用与前面提到的AccuracySec语句相同的快捷名称,但 systemd 将这些名称规范化为秒。例如,你可能想指定一个 timer,在系统启动 5 天后触发一次事件,可以这样写: OnBootSec=5d。如果主机在2020-06-15 09:45:27启动,timer 将在2020-06-20 09:45:27或之后一分钟内触发。优势之一:相比 cronjob 更灵活的语法Calendar event 定义是在所需的重复时间触发 timer 的关键部分。首先看一下OnCalendar设置中使用的一些规格。systemd 及其 timer 使用的时间和日期规格与 crontab 中使用的格式不同。它比 crontab 更灵活,允许以at命令的方式模糊日期和时间。使用OnCalendar=的 systemdtimer 的基本格式是DOW YYYY-MM-DD HH:MM:SS。DOW(星期)是可选的,其他字段可以使用星号(*)来匹配该位置的任何值。所有日历时间形式都被转换为规范化的形式。如果没有指定时间,则假定其为 00:00:00。如果没有指定日期但指定了时间,那么下一个匹配可能是今天或明天,这取决于当前的时间。名称或数字可用于月份和星期。可以指定每个单位的逗号分隔的列表。单位范围可以在开始和结束值之间用…来指定。有几个有趣的选项用于指定日期。波浪号(~)可以用来指定该月的最后一天或该月最后一天之前的指定天数。”/”可以用来指定一周中的某一天作为修饰语。下面是一些在OnCalendar语句中使用的典型时间规格的例子:表 2: 示例OnCalendar event 定义优势之一:更丰富的使用/运维命令集systemd 提供了一个很好的工具来验证和检查 timer 中的日历时间事件规范。systemd-analyze calendar工具解析了一个日历时间事件规范,并提供了规范化的形式以及其他有趣的信息,比如下一个 “elapse”(即匹配)的日期和时间,以及达到触发时间前的大致时间。首先,看一下未来的一个没有时间的日期:现在添加一个时间。在这个例子中,日期和时间作为非相关实体被单独分析:要把日期和时间作为一个 unit 来分析,需要用引号把它们括起来。现在测试表 2 中的条目。选一个复杂的:让我们看一个例子,在这个例子中,我们列出了时间戳表达式的下五个执行时间:这应该给你足够的信息来开始测试你的OnCalendar时间规格。以上就是“怎么使用systemdtimer替代cronjob”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注百云主机行业资讯频道免费云主机域名

相关推荐: php无法加载js和css如何解决

本篇内容介绍了“php无法加载js和css如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 一、原因代码错误代码错误可能是php无法加载jscss的最常见…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 06/20 13:28
Next 06/20 13:28

相关推荐