繁体   English   中英

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

[英]Run cron job every 10 seconds n times then stop

我有一种特殊的情况,我需要查询服务以在每天的特定时间获取n位用户的信息。 问题是,如果我一次执行所有操作,它将使服务脱机/崩溃。

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

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

该解决方案的问题(据我个人所述)是,每10秒运行一次的第二个脚本必须每次查询DB,以查明“开始查询”设置是否设置为1。这可能会占用大量处理器资源。 有谁有更好的解决方案?

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

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

为什么不仅要有一个每天运行的cron脚本,而且每隔十秒才调用另一个脚本,直到另一个脚本表明已完成(例如,返回一个表示“无需处理的值”)?

或者一个每天运行的脚本,它只是循环地遍历用户块,对每个X用户执行sleep()...

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

例如,对于第一种方法,您甚至不必将PHP用于“控制”脚本-一个非常简单的shell脚本,该脚本只是循环,调用PHP脚本然后休眠,然后检查“成功”返回值(由PHP脚本的exit ()函数返回)就可以了。

您可以将“ at”与“ cron”结合使用。 设置一个每天执行一次任务的cron作业,该任务就是(我现在没有UNIX机器,所以可能有奇怪的语法错误)。

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

参数是运行计数。 当shellscript运行时,它会重新计划运行时间,从而增加运行次数,因此您可以:

#!/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”可以下降到每秒(不确定是否可行;可能取决于实现方式)。 如果不是这样,那么解决方案从一开始就可能无效:-)在这种情况下,最好让一个脚本执行填充和睡眠操作(根据Matt Gibson的回答)。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM