Fah*_*tha 120 cron systemd-timer
最近有人向我指出,存在 cron 的替代方案,即 systemd 计时器。
但是,我对 systemd 或 systemd 计时器一无所知。我只用过 cron。
Arch Wiki 中有一些讨论。但是,我正在寻找cronsystemd 计时器和 systemd 计时器之间的详细比较,重点是利弊。我使用 Debian,但我想对所有提供这两种替代方案的系统进行一般比较。该集合可能仅包括 Linux 发行版。
这是我所知道的。
Cron 非常古老,可以追溯到 1970 年代后期。cron 的原作者是 Unix 的创造者 Ken Thompson。Vixie cron 可追溯到 1987 年,现代 Linux 发行版中的 cron 是其中的直系后代。
Systemd 更新很多,也有些争议。维基百科告诉我它的初始版本是 2010 年 3 月 30 日。
因此,我目前的 cron 相对于 systemd 计时器的优势列表是:
Cron 保证可以在任何类 Unix 系统中使用,因为它是一个可安装的受支持软件。这不会改变。相比之下,systemd 将来可能会或可能不会保留在 Linux 发行版中。它主要是一个 init 系统,可能会被不同的 init 系统取代。
Cron 使用起来很简单。绝对比 systemd 计时器简单。
systemd 计时器相对于 cron 的相应优势列表是:
因此,总而言之,以下是一些最好在答案中看到的内容:
Far*_*olK 68
以下是关于这两者的一些要点:
检查您的 cron 作业的真正作用可能有点混乱,但是所有 systemd 计时器事件都像其他 systemd 单元一样根据事件仔细记录在 systemd 日志中,这使事情变得更加容易。
systemd 计时器是 systemd 服务,具有资源管理、IO CPU 调度等所有功能......
有一个列表:
使用依赖项选项就像其他 systemd 服务一样,可以依赖于激活时间。
单元可以以不同方式激活,也可以配置它们的组合。服务可以由不同的事件启动和触发,例如用户、启动、硬件状态更改或例如在某些硬件插入后 5 分钟,...
更容易配置一些文件和直接标签,以根据您的需要使用 systemd 计时器进行各种自定义。
轻松启用/禁用整个事情:
systemctl enable/disable
Run Code Online (Sandbox Code Playgroud)
并杀死所有工作的孩子:
systemctl start/stop
Run Code Online (Sandbox Code Playgroud)systemd 计时器可以使用日历和单调时间进行调度,这在不同时区的情况下非常有用,...
systemd 时间事件(日历)比 cron 更准确(似乎 1s 精度)
systemd 时间事件更有意义,对于那些重复发生的事件,甚至应该发生一次的事件,这里是文档中的一个示例 :
Sat,Thu,Mon-Wed,Sat-Sun ? Mon-Thu,Sat,Sun *-*-*00:00:00
Mon,Sun 12-*-* 2,1:23 ? Mon,Sun 2012-*-* 01,02:23:00
Wed *-1 ? Wed *-*-01 00:00:00
Wed-Wed,Wed *-1 ? Wed *-*-01 00:00:00
Wed, 17:48 ? Wed *-*-* 17:48:00
Run Code Online (Sandbox Code Playgroud)从 CPU 使用的角度来看,systemd 计时器会在经过的时间唤醒 CPU,但 cron 会更频繁地这样做。
可以根据执行的完成时间安排计时器事件,可以在执行之间设置一些延迟。
与其他程序的通信也值得注意,有时其他程序需要了解计时器及其任务的状态。
小智 24
直接从马嘴里说出来,可以这么说:https : //wiki.archlinux.org/index.php/Systemd/Timers#As_a_cron_replacement
上页摘录:
好处
使用计时器的主要好处来自每个作业都有自己的 systemd 服务。其中一些好处是:
- 可以独立于计时器轻松启动作业。这简化了调试。
- 每个作业都可以配置为在特定环境中运行(请参阅 systemd.exec(5))。
- 作业可以附加到 cgroup。
- 可以将作业设置为依赖于其他 systemd 单元。
- 作业记录在 systemd 日志中,以便于调试。
注意事项
一些用 cron 很容易做的事情,单独用定时器单元很难做到。
- 复杂性:要使用 systemd 设置定时作业,您需要创建两个文件并运行几个 systemctl 命令。将其与向 crontab 添加一行进行比较。
- 电子邮件:没有内置相当于 cron 的 MAILTO 用于在作业失败时发送电子邮件。有关使用 OnFailure= 设置等效项的示例,请参阅下一节。
让我举一下您最近在评论中提到的 POP3 示例。这是一个很好的例子,因为 POP3 无法通知新邮件的到达。(对于 IMAP 访问,我不会使用计时器解决方案,因为 IMAP 实际上可以通知!)
\ncrontab -e\nRun Code Online (Sandbox Code Playgroud)\n-e代表编辑。注意:不带选项启动不会提供帮助,但如果您无法在不保存的情况下退出编辑器,则会刷新所有现有的 cron 作业。\xe2\x80\x94 如果您有现有作业,这绝对意味着会丢失工作。
因此,在编辑模式下添加一行:
\n30 14,21 * * * mpop --quiet\nRun Code Online (Sandbox Code Playgroud)\nmpop下午 2:30 和晚上 9:30推出。
理论上,您也可以编辑/var/spool/cron/crontabs/username,但大多数 cron 不会注意到,并且目录权限通常不允许直接访问该文件。
Cron 作业的调试乐趣较少。通常情况下,您最终会每分钟安排一次,直到您信任它并正确设置频率。
\n否则,它是一个用于重复工作的非常快速的界面。
\n如今,当您没有运行 cron 守护程序时,\xe2\x80\x99 不要感到惊讶。软件包systemd-cron(至少在 Debian 上)为您提供带有 cron 用户界面的 systemd 计时器:它为您透明地转换 crontab 行,并且命令行工具是相同的。\xe2\x80\x94另一种方式可能永远不会存在。
loginctl enable-linger\nRun Code Online (Sandbox Code Playgroud)\n必须运行一次(并且不再运行)。它确保用户模式 systemd 在启动时启动。否则第一次登录就会启动它。
\nsystemctl --user edit --full --force mpop.service\nRun Code Online (Sandbox Code Playgroud)\n您还可以运行systemctl edit mpop.service以获得连续的错误和提示,引导您使用选项进入正确的命令行:
No files found for mpop.service.\nRun 'systemctl edit --force --full mpop.service' to create a new unit.\nRun Code Online (Sandbox Code Playgroud)\n运行建议的命令将揭示写入文件的权限问题,并要求输入密码来重新加载系统守护程序。\xe2\x80\x94此时,您应该记住添加与--user用户 systemd 实例的对话。注意:您也可以选择系统实例,但我\xe2\x80\x99m 没有在这里描述。这是相似的。
与 cron 不同,您确实可以直接访问该文件~/.config/systemd/user/mpop.service,但您必须自己记住路径。并且在某些情况下systemd --user daemon-reload是需要的。例如,如果文件实际上存在并已加载。systemd --user edit ...在任何情况下都会执行守护进程重新加载,因此您不必\xe2\x80\x99。
因此,在mpop.service文件中添加:
[Service]\nType=oneshot\nExecStart=mpop --quiet\nRun Code Online (Sandbox Code Playgroud)\n您可以使用 来测试运行它systemctl --user start mpop。mpop是mpop.service这里的缩写。
使用(的缩写)检查详细信息systemctl --user status mpop或过去运行的完整输出。journalctl --user -u mpop-u--unit
对于systemd,定时器是触发服务单元的另一个单元。
\n创建一个:
\nsystemctl --user edit --full --force mpop.timer\nRun Code Online (Sandbox Code Playgroud)\n并在编辑器中保存以下内容:
\n[Timer]\nOnCalendar=*-*-* 14,21:30:00\n\n[Install]\nWantedBy=timers.target\nRun Code Online (Sandbox Code Playgroud)\n可以OnCalendar=写得更短一些。由于Unit=没有明确写入 to activate ,因此将使用同名的服务。
与服务(短期)一样,计时器(长期)最初将关闭。该服务是由定时器激活的,所以不用担心。
\n但是什么激活了计时器呢?\xe2\x80\x94这就是该[Install]部分发挥作用的地方。它与 相关,systemctl --user enable/disable ...而且它们都有非常不幸的名字。
应该调用该部分[Hooks]和命令... hook/unhook ...。理由:
mpop.timer文件的存在而安装enable该单元(尽管您会收到后者的警告),但它将显示为 \xe2\x80\x9cenabled\xe2\x80\x9d 。mpop.service单元没有[Install]部分并且enable/disable不执行任何操作,它显示为 \xe2\x80\x9cstatic\xe2\x80\x9d,即使它是 \xe2\x80\x9cenabled\xe2\x80\x9d话虽如此,您可以看到该WantedBy=钩子提到了一个众所周知的目标,该目标在正常情况下启动,并且应该用于计时器。
现在和执行以下步骤后使用systemctl --user list-dependencies default.target,看看周围会发生什么timers.target:
systemctl --user enable mpop.timer # hooks it into the timers.target\nsystemctl --user start timers.target # this or reboot\nRun Code Online (Sandbox Code Playgroud)\n我认为执行start而timers.target不是mpop.timer(两者都有效)更好的实践。它有助于检测[Install]计时器单元部分中的拼写错误,并在重新启动时更接近执行路径。