Php 每隔15秒进行一次cron
即使在专用服务器上,我也无法将cron时间设置为小于1分钟。 我需要它每15秒运行一次,因为它调用betfair api,并且计算高度依赖于时间。Php 每隔15秒进行一次cron,php,hosting,cron,dedicated,betfair,Php,Hosting,Cron,Dedicated,Betfair,即使在专用服务器上,我也无法将cron时间设置为小于1分钟。 我需要它每15秒运行一次,因为它调用betfair api,并且计算高度依赖于时间。 请告知。Cron只允许您以每分钟一次的速度运行 我要做的是在你的脚本中做15秒的计时 每分钟执行一次父脚本 在脚本存在并开始新周期之前,在该脚本中每隔15秒执行一次子脚本 如果您需要每隔15秒调用一次作业,请不要使用cron。cron的设计目的是请求要在很久以后完成的作业 相反,在父脚本完成作业后,先休眠15秒,然后调用子脚本,然后退出。子脚本可以
请告知。Cron只允许您以每分钟一次的速度运行 我要做的是在你的脚本中做15秒的计时
- 每分钟执行一次父脚本
- 在脚本存在并开始新周期之前,在该脚本中每隔15秒执行一次子脚本
如果您的服务器没有时间限制,那么您甚至不需要生成子脚本。只要睡15秒,做你的事,睡15秒,做下一件事,依此类推。睡眠脚本不消耗CPU,尽管它确实消耗RAM。但这比循环你主人的PID要好;这可能会使主机感到不安。Cron是一种作业调度程序,其构建的分辨率至少为一分钟。如果你需要一个比这更好的分辨率,你要么找到另一个调度工具,要么自己动手 我过去用过的一个例子如下。您配置了所需的间隙和最小间隙,以下脚本将每隔
N
秒执行一次有效负载。请注意,这不是一个简单的“每次迭代之间等待N
秒”调度程序。实际上,它在上一次迭代开始后几秒钟开始下一次迭代,而不是在结束后
最小间隙存在,因此,如果有效负载占用的时间超过N
秒,则它不会连续运行。如果您确实希望它在这种情况下连续运行,只需将最小间隙设置为0
执行此操作的代码如下所示:
#!/usr/bin/bash
payload() {
if [[ $1 -eq 1 ]] ; then
echo "Sleeping for 1 second at $(date +%H:%M:%S)."
else
if [[ $1 -lt 10 ]] ; then
echo "Sleeping for $1 seconds at $(date +%H:%M:%S)."
else
echo "Sleeping for $1 seconds at $(date +%H:%M:%S)."
fi
fi
sleep $1
echo " Finished at $(date +%H:%M:%S)."
echo
}
gap=10
mingap=3
for i in {1..20} ; do
next=$(($(date +%s) + ${gap}))
payload ${i}
if [[ ${mingap} -ne 0 ]] ; then
sleep ${mingap}
fi
while [[ $(date +%s) -lt ${next} ]] ; do
sleep 1
done
done
有效负载不是逻辑的一部分,它只是为了调试而存在的东西。你可以用你想要的任何东西来代替它。此外,for循环的也是一个示例。您可以将其替换为无限循环,或者让脚本只进行(例如)60分钟的迭代,每小时cron
启动一个脚本的新实例
下面是示例运行。您可以看到,负载每10秒运行一次(由于睡眠
的变幻莫测,负载运行的时间为11秒),直到超过7秒。在这一点上,最小间隙开始起作用
Sleeping for 1 second at 14:36:08.
Finished at 14:36:09.
Sleeping for 2 seconds at 14:36:18.
Finished at 14:36:20.
Sleeping for 3 seconds at 14:36:28.
Finished at 14:36:31.
Sleeping for 4 seconds at 14:36:39.
Finished at 14:36:43.
Sleeping for 5 seconds at 14:36:49.
Finished at 14:36:54.
Sleeping for 6 seconds at 14:37:00.
Finished at 14:37:06.
Sleeping for 7 seconds at 14:37:10.
Finished at 14:37:17.
Sleeping for 8 seconds at 14:37:20.
Finished at 14:37:28.
Sleeping for 9 seconds at 14:37:31.
Finished at 14:37:41.
Sleeping for 10 seconds at 14:37:44.
Finished at 14:37:54.
Sleeping for 11 seconds at 14:37:57.
Finished at 14:38:08.
Sleeping for 12 seconds at 14:38:11.
Finished at 14:38:23.
Sleeping for 13 seconds at 14:38:27.
Finished at 14:38:40.
Sleeping for 14 seconds at 14:38:43.
Finished at 14:38:57.
Sleeping for 15 seconds at 14:39:00.
Finished at 14:39:15.
Sleeping for 16 seconds at 14:39:18.
Finished at 14:39:34.
Sleeping for 17 seconds at 14:39:38.
Finished at 14:39:55.
Sleeping for 18 seconds at 14:39:58.
Finished at 14:40:16.
Sleeping for 19 seconds at 14:40:19.
Finished at 14:40:38.
Sleeping for 20 seconds at 14:40:41.
Finished at 14:41:02.
你的服务器脚本也是用php编写的吗?看起来像是重复的,可能是重复的,谢谢。请你能告诉我,在阅读了很多之后,我认为你的解决方案是最简单和完美的。不,不是。cron只允许您将时间安排到最近的一分钟,部分原因是它不能保证作业实际开始的时间,因此即使在一分钟内也会出现大量抖动。已经说过,任何类型的非交互式处理都应该是web应用程序的最后手段。如果您需要这种实时调度的准确性,那么不应该用PHP编写。甚至可能不在非实时操作系统上运行它。@symcbean当然,你是对的,但如果应用了适当的实用性,它在大多数用例中都能令人满意地工作。就我个人而言,我发现@Lie Ryan的答案和@Vegard Larsen的评论最合适。@symcbean,我的申请非常依赖于两次执行之间的最短时间,我计划将15秒减少到5秒。这就是为什么我选择了专用主机。顺便说一句,我只运行这个脚本。服务器详细信息为操作系统:Ubuntu Linux 10.04.1,CPU:Intel(R)Core(TM)2 Duo CPU E7500@2.93GHz 2核,RAM:2GB。请确保在此处设置了一些冗余。如果脚本失败(因为它最终会失败),请确保它每分钟由cron作业重新启动一次(如果它尚未运行)。你最多会丢失一分钟的数据。谢谢你的回复。这也是一个很好的解决方案,但我对服务器的性能没有信心。我认为最好在1分钟后运行cron并睡眠15秒。