如果您使用SystemD运行最近的Linux操作系统,您可以使用SystemD Timer单元以您希望的任何粒度级别(理论上低至纳秒)运行您的脚本,并且 - 如果您愿意 - 比Cron允许的更灵活的启动规则 . No sleep kludges required
设置比cron文件中的单行要多一些,但如果你需要比“每分钟”更好的东西,那么值得付出努力 .
该SystemD计时器模型基本上是这样的 - 计时器是在计时器过去时启动服务单元的单元 .
因此,对于要安排的每个脚本/命令,您必须具有服务单元,然后是其他计时器单元 . 单个计时器单元可以包含多个计划,因此您通常不需要多个计时器和一个服务 .
这是一个每10秒记录一次“Hello World”的简单示例:
/etc/systemd/system/helloworld.service :
[Unit]
Description=Say Hello
[Service]
ExecStart=/usr/bin/logger -i Hello World
/etc/systemd/system/helloworld.timer :
[Unit]
Description=Say Hello every 10 seconds
[Timer]
OnBootSec=10
OnUnitActiveSec=10
AccuracySec=1ms
[Install]
WantedBy=timers.target
设置这些单元后(如 /etc/systemd/system ,如上所述,对于系统范围的设置,或在 ~/.config/systemd/user 进行用户特定设置),您需要通过运行 systemctl enable helloworld.timer 来启用计时器(不是服务) . 如果要立即启动计时器(而不是在重新启动后等待它启动),也要运行 systemctl start helloworld.timer .
此处使用的 [Timer] 部分字段如下:
OnBootSec - 每次启动后多秒启动服务 .
OnUnitActiveSec - 在上次启动服务后的几秒钟内启动服务 . 这就是导致计时器重复并且表现得像cron作业的原因 .
AccuracySec - 设置计时器的准确性 . 定时器仅与此字段集一样准确,默认值为1分钟(模拟cron) . 不要求最佳精度的主要原因是提高功耗 - 如果SystemD可以安排下一次运行与其他事件一致,则需要更少地唤醒CPU . 上面示例中的 1ms 并不理想 - 我通常在我的子分钟预定作业中将精度设置为 1 (1秒),但这意味着如果您查看显示"Hello World"消息的日志,那么'd see that it is often late by 1 second. If you'就可以了,我建议将精度设置为1秒或更长 .
您可能已经注意到,此计时器不会在每个挂钟时段的开始处开始(即,它不会在时钟的第10秒开始,然后是20,依此类推) . 相反,只是在计时器瘫痪时发生 . 如果系统在12:05:37启动,则下次命令运行时间为12:05:47,然后是12:05:57等 . 如果您对实际挂钟精度感兴趣,那么您可以想要替换 OnBootSec 和 OnUnitActiveSec 字段,而是使用您想要的计划设置 OnCalendar 规则(根据我的理解,使用日历格式不能超过1秒) . 上面的例子也可以写成:
OnCalendar=*-*-* *:*:00,10,20,30,40,50
最后注意:正如您可能猜到的那样, helloworld.timer 单元启动 helloworld.service 单元,因为它们具有相同的名称(减去单元类型后缀) . 这是默认设置,但您可以通过为 [Timer] 部分设置 Unit 字段来覆盖它 .
更多血腥细节可在以下网址找到: