30秒的cron没有结束执行

问题描述:

我有这样的克龙(拆分成多行以便于阅读)30秒的cron没有结束执行

8,18,28,38,48,58 * * * * 
/usr/local/bin/setlock 
-n /tmp/cronlock.1618472.147531 sh 
-c $'/home/ryannaddy/trendie.co/get/next_trends' 

它运行这个文件:

#!/usr/local/php54/bin/php-cgi -q 
<?php 
set_time_limit(90); 
require_once __DIR__ . "/../includes/setup.php"; 
$db = new Database(); 

$lock = (bool)$db->getOne("select get_lock('get_trends', 0)"); 
// File is already running; don't run again. 
if(!$lock){ 
    echo "Lock Exists\n"; 
    exit; 
} 

$trendie = new Trendie(); 
$trendie->prepare(); 

$trendie->setNextId(); 
$trendie->getCandidates(); 
$trendie->selectFinal(); 

$db->getOne("select release_lock('get_trends')"); 

出于某种原因,cron的不总是结束,它可以运行几个小时,但它不应该。平均而言,它成功运行约30秒,但时不时会结束,我不得不手动登录到我的服务器并杀死进程以允许它运行。

我试图删除mysql get_lock,但那不能解决它。我还添加了set_time_limit(90),但这并没有解决它。 $trendie->getCandidates方法根据应用程序使用网站的API或file_get_contents()执行大量http请求(15-20)。但如前所述,他们通常在30秒内结束。

所以......如果运行时间太长,为什么不限制为90秒set_time_limit(90);

我有cron的一套给我发电子邮件任何输出,而我得到这个时候它不工作:

setlock: fatal: unable to lock /tmp/cronlock.1618472.147531: temporary failure 
+0

看看超时程序并在你的cronjob中使用它,它将确保你的脚本终止,如果它永远运行http://linux.die.net/man/1/timeout - 你也在安全模式下运行因为set_time_limit将不能在安全模式下工作 – Anigel 2013-05-13 16:11:56

+0

您可能可以通过在事务中运行所有sql来避免在此处执行锁定。请参阅http://www.php.net/manual/en/mysqli.quickstart.transactions.php请注意,事务支持取决于存储引擎。在不支持事务的引擎上,开始事务调用将默默无闻。 – Orangepill 2013-05-13 16:12:59

我所做的,是我创造了另一个的cron,一个运行前1分钟这一个与此代码在其中:

#!/bin/sh 
pkill -f next_trends 

到目前为止,它已经像一个魅力工作!

+0

如果有效,那么最初的cron作业不应该锁定在第一位。 – symcbean 2013-05-17 15:45:08