我有这个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或http
执行大量file_get_contents()
次请求(15-20),具体取决于应用程序。但如前所述,它们通常都会在30秒内结束。
所以...如果运行时间过长,为什么不限制为90秒set_time_limit(90);
?
我有cron设置给我发电子邮件任何输出,当它不起作用时我得到它:
setlock: fatal: unable to lock /tmp/cronlock.1618472.147531: temporary failure
答案 0 :(得分:-1)
我做了什么,是我创建了另一个cron,一个在此之前运行1分钟的cron,其中包含以下代码:
#!/bin/sh
pkill -f next_trends
到目前为止它已经像魅力一样发挥作用了!