不,Vixie cron 中没有任何符号可以在不是偶数倍的时间间隔安排某些事情。你必须求助于 Vixie cron 之前的标准做法(无论如何这只是 Linux 上的标准),这只是为了枚举时间。
0 0,5,10,15,20 * * * yourjob
50 0,5,10,15,20 * * * yourjob
40 1,6,11,16,21 * * * yourjob
30 2,7,12,17,22 * * * yourjob
20 3,8,13,18,23 * * * yourjob
10 4,9,14,19 * * * yourjob
为简单起见,这缩短了午夜前的最后一个时间间隔 - 仅 40 分钟而不是 50 分钟 - 以避免不得不拼出更复杂的时间表。
或者,您可以在午夜之前运行一个 cron 作业,将 at 作业安排在接下来的 24 小时内。
59 23 * * * yourschedule
yourschedule 可能类似于
#!/bin/bash
for ((i=0; i<60*24; i+=50)); do
echo yourjob | at $((i/60)):$((i%60))
done
或者使用自调度的at 作业,它将在 50 分钟后永远“植入”下一次运行:
#!/bin/bash
echo "$0" | at "+50 minutes"
# ... your original yourjob script here ...
(不确定您的 at 是否支持该时间指示器;请参阅其 man 页面和/或实验。atq 显示您已排队的作业,atrm 可让您删除作业。)
在某些情况下,每 10 分钟运行一次 yourjob 可能更容易,如果距离上次运行不到 45 分钟,则立即中止它。 (然后你必须让它跟踪它的运行时间,但它不必非常参与 - 可能会触摸一个标志文件,因此它的更改日期表示上次运行。
#!/bin/bash
if (($(date +%s) - $(stat -c '%Y' .lastrun.50min) < 45*60)); then
exit 0
fi
touch .lastrun.50min
# ... Your original yourjob script here
stat -c '%Y' 是 GNU/Linux;对于其他平台,语法会略有不同。)
在 Paul Vixie 的 cron 实现被 Linux 采用并流行起来之前,crontab 通常不允许像 */5 这样的周期符号。那时候,你总是需要拼出时间,比如5,10,15,20,...