[英]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的回答)。
多种方法可以做到这一点:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.