我已经使用 cron 有一段时间了;我觉得我理解其中的一些缺点,以及如何解决这些问题。其中之一缺点是 cron 在启动过程中不知道其他服务的状态;也就是说@reboot
,当某个作业所需的服务尚不可用时,它可能会导致 cron 中的设施安排的作业出现问题。我将称之为计划@reboot
任务。
一解决方法解决此问题的方法是在脚本启动sleep
之前插入一条命令。@reboot
例如,在crontab
条目中:
@reboot sleep 15; /path/to/script.sh
AFAIK,这是处理问题的常见做法cron @reboot 问题
据说 systemd 可以取代该@reboot
工具,并在初始化/启动期间为用户提供更好的控制。这种改进的“成本”是crontab
用单元文件和 systemd 学习曲线替换单行。但由于 cron 服务本身是在 systemd 下启动的(通过/lib/systemd/system/cron.service
我的 Raspberry Pi巴斯特OS),似乎 cron 可以以消除计划@reboot
任务。好像有点不协调的在 systemd 下,人们需要继续使用sleep
hack 来解决计划@reboot
任务。
我仍在研究我的 systemd功绩徽章,但有一个观念,即 cron 应该是其中之一最后的服务已初始化。我这样说是因为如果 cron 是启动时的最终服务命令,然后它遵循这一切依赖关系也应该感到满意,并且sleep
我的@reboot
cron 工作中的 hack 可以被消除。
在尝试了解如何指示 systemd 在初始化序列结束时或接近结束时启动 cron 时,我发现了一个答案说明cron.service
可以作为最后一个过程开始通过插入Type=idle
./lib/systemd/system/cron.service
要测试这一点,请使用之前和之后单元文件的版本cron.service
似乎是一个合理的方法; IE:
- 跑步
systemd-analyze plot > startup_order_noidle.svg
- 添加
Type=idle
cron.service
- 重启
- 跑步
systemd-analyze plot > startup_order_idle.svg
不幸的是,列出 systemd 下服务的启动顺序似乎是一个深不可测的锻炼。使用systemd-analyze
iaw 这篇文章似乎提供了一个答案,但它并没有像我希望的那样工作 -cron.service
并不总是列出。让我解释:
这.SVG文件大小巨大,我无法共享它们,但startup_order_noidle.svg
没有cron.service
在列表中的任何位置显示。奥托,startup_order_idle.svg
做过显示cron.service
在下面的行上systemd-logind.service
。 IoW,如果没有Type=idle
添加,cron.service
就不会出现 - 即使它已经启动了。
到回顾:在所有其他服务/设备/目标/等启动后,systemd 下是否有可靠的方法来启动 cron?有没有可靠的方法来验证这一点?
答案1
通常,对于单元文件,您需要指定“After=”和“Requires=”标志,因为您通常有一个具体的“要求”,之后需要加载服务。
如果您希望这是最后加载的服务,我建议您采用创建自己的目标的方法,该目标将在当前配置的最后一个目标(multi-user.target 或graphical.target 等)之后加载。 )。
在这种情况下,如果安装了新服务,它们通常会默认为预先配置的目标,例如多用户,因此无论发生什么变化,您的 cron 服务都绝对是最后一个。
巧合的是,您链接的问题包含如何执行此操作的完整描述:https://superuser.com/a/1543365
关于验证启动顺序 - 您可以使用以下命令:
systemctl list-units [-all] [--state=xxx]
*
与状态:
- 不活动(可选)
- 激活
- 失败的
作为 cron 服务中预启动 exec 的一部分,用于打印/记录所有尚未启动(或已失败)的服务,如果输出activating
为空(或包含您知道应在 cron 之后启动的服务),那么您可以请放心,cron 确实是最后一个启动的。
请注意,这是一种解决方法,因为systemd-analyze plot
您声称它在您的用例中不可靠。
* 还提供其他状态:active
、deactivating
、dead
、not-found
。可以在此处找到简要说明以及一些其他来源:https://superuser.com/a/896951