我想知道有多准确和确定的cron时间是。假设我得到了在11:00运行的cron作业,然后作为这个cron作业的参数传递时间。在任何情况下,参数中的时间是否可能不同,例如11:00:01。我能否100%地确定执行将在确切的时间内进行?我担心的事情,如沉重的服务器负载或任何意外的情况。有什么影响吗?我认为它可以。
我还想知道如何将计划执行时间作为参数传递,而不是实际时间。让我们假设实际执行延迟了,比如11:00:01。我如何传递在cron作业中定义的计划时间,所以11:00:00,以及当cron作业设置为每10分钟运行一次时,如何传递?在这种情况下,是否有可能获得计划时间,以便每次执行脚本时都将计划时间作为参数?
10 * * * * /tmp/script.sh $(date)发布于 2020-08-04 12:16:45
通过查看我自己的syslog,我可以看到cron作业usuallY在1秒后就开始了(Ubuntu20.04)。(例如:05:10:01的五个触发器有十个)。在我的系统中,这是相当稳定的,但我不会保存它。
在负载较重的情况下,这可能会更糟,因为即使在正确的时间触发了cronjob,极重的负载也可能使过激延迟超过一秒钟。但是,这样的极端负载会使您的脚本慢得太慢,开始时间将变得毫无意义。
Cron可以而且确实偶尔跳过作业,例如,如果系统被关闭,它将永远赶不上。在手册中,我将特别注意这一点:
请注意,这意味着不存在的时间,如夏时制转换中的“缺失小时”,将永远无法匹配,从而导致在“缺失时间”期间调度的作业无法运行。同样,多次发生的事件(同样,在日光节约转换期间)将导致匹配的作业运行两次。
确保您的代码在05:10:02而不是05:10:01运行时不会中断。
没有一种优雅的方法可以让cron告诉你哪个工作在运行。您可以设置许多相同的作业,以便在不同的时间运行,每个作业都可以作为参数传递时间。我认为有两种选择:
设置一个crontab
请检查下面的笔记。
是的,一天有1440分钟,所以如果您需要一个crontab来运行这一分钟,您可能需要一个脚本来生成crontab:
#!/bin/bash
for hour in {0..23} ; do
for minute in {0..59} ; do
echo "${minute} ${hour} * * * root /path/to/script.sh ${hour}:${minute}:01"
done
done > /etc/cron.d/my-job你最终会得到这样的结果:
01 00 * * * root my-job 00:01:01
02 00 * * * root my-job 00:02:01
03 00 * * * root my-job 00:03:01
...最好创建一个包装器脚本,检查当前时间并找到最近的条目。如果您的作业设置为每15分钟运行一次,则可以使用这里提供的例子:
#!/bin/bash
curdate=`date "+%s"`
run_time=$(($curdate - ($curdate % (15 * 60))))
run_time_arg=$(date -d"@$run_time" "+%H:%M:%S")
/path/to/script.sh $run_time_arg注意,这确实使用了GNU date的特定行为,而且可能并不适用于所有的实现。
https://unix.stackexchange.com/questions/602792
复制相似问题