我有這樣的克龍(拆分成多行以便於閱讀)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
看看超時程序並在你的cronjob中使用它,它將確保你的腳本終止,如果它永遠運行http://linux.die.net/man/1/timeout - 你也在安全模式下運行因爲set_time_limit將不能在安全模式下工作 – Anigel 2013-05-13 16:11:56
您可能可以通過在事務中運行所有sql來避免在此處執行鎖定。請參閱http://www.php.net/manual/en/mysqli.quickstart.transactions.php請注意,事務支持取決於存儲引擎。在不支持事務的引擎上,開始事務調用將默默無聞。 – Orangepill 2013-05-13 16:12:59