2013-05-13 62 views
0

我有這樣的克龍(拆分成多行以便於閱讀)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

回答

-1

我所做的,是我創造了另一個的cron,一個運行前1分鐘這一個與此代碼在其中:

#!/bin/sh 
pkill -f next_trends 

到目前爲止,它已經像一個魅力工作!

+0

如果有效,那麼最初的cron作業不應該鎖定在第一位。 – symcbean 2013-05-17 15:45:08

相關問題