每10秒运行一次cron作业n次然后停止

时间:2010-10-12 09:34:32

标签: php cron

我有一种特殊情况,我需要查询服务,以便在每天的特定时间获取n个用户的信息。问题是,如果我一下子完成所有操作,它会使服务脱机/崩溃。

所以要克服这个问题,最好每隔10秒左右为x个用户运行一次,直到x = n,然后停止。

我可以设置每天运行1个cron脚本,另一个每10秒运行一次。例如,每日脚本会将DB中的值设置为1('开始查询')(默认值为0表示关闭),然后第二个脚本(每10秒运行一次)将此数据库值检查为1。设置为true然后迭代通过用户一次查询服务x用户并递增同一数据库表中的另一列以跟踪它在列表中的位置。

此解决方案的问题(根据我的说法)是每10秒运行的第二个脚本每次都要查询数据库,以确定“开始查询”设置是否设置为1.这可能是相当的处理器重。有没有人有更好的解决方案?

注意:代码是用PHP编写的 - 由于服务器上php脚本的最大执行时间而无法使用睡眠

我可以在python中同样执行此操作,是否有最大限度执行cgi脚本?

3 个答案:

答案 0 :(得分:5)

为什么不只是每天运行一个cron脚本,并且每隔十秒调用另一个脚本,直到另一个脚本完成它为止(例如返回一个“不再需要处理”的值)?

或者一个每天运行的脚本,只是循环遍历用户块,每个X用户都在睡眠()...

请记住,使用CLI version of PHP时,您不受执行时间限制的约束,并且您可以使用标准错误和输出流等与cron和其他shell脚本进行非常好的交互。

例如,对于第一种方法,您甚至不必使用PHP作为“控制”脚本 - 一个非常简单的shell脚本,只需循环,调用PHP脚本然后休眠,并检查“成功“返回值(由PHP脚本的exit()函数返回)将没问题。

答案 1 :(得分:1)

您可以将'at'与'cron'结合使用。设置一个每天运行一次任务的cron作业,并且该任务是(我目前没有在我面前的UNIX框,因此可能存在奇怪的语法错误)。

0 9 * * * at now + 10 secs /path/to/shellscript 1

参数是运行计数。当shellcript运行时,它会重新安排自己运行,增加运行次数,所以你可以:

#!/bin/ksh

integer i
let i=1+$1
if [[ $i -lt 11 ]]
then
    at now + 10 secs /path/to/shellscript $i

    # do everything else the script needs to do
fi

注意:此解决方案还假设“at”可以降至每秒一次(不确定是否可能;可能取决于实施)。如果它没有这个解决方案可能从关闭无效:-)在这种情况下你最好有一个脚本做东西和睡觉(根据马特吉布森的答案)。

答案 2 :(得分:0)

有多种方法可以做到这一点:

  • 拥有一个运行部分作业的脚本,将所有数据放入一个序列化数据和状态的变量中。我已经为代码点火器实现了一个调度程序控制器,以便在http://www.younelan.com/index.php?&repository=DCExplorer时获取一个地铁路由。它可能比你正在看的更复杂,但可能会让你知道如何以不同的间隔运行多个任务,将它们分成更小的部分
  • 通过cron或手动从命令行运行脚本 - 没有超时的痛苦