如果我有一个每分钟运行一次的cron作业,并且第一次迭代运行62秒,那么第二次迭代是否会等到第一次出现结束,或者是否可能同时运行相同的cron作业?
为了说明这一点,请参阅方案1:
|0 |60 |120 |180 |240 |300
------ Cron Job 1 Taking 60 Seconds
--------- Cron Job 2 Taking 90 Seconds
------ Cron Job 3 Taking 90 Seconds but overlapping with the previous cron job
上述情况会发生,还是会发生情景2:
|0 |60 |120 |180 |240 |300
------ Cron Job 1 Taking 60 Seconds
--------- Cron Job 2 Taking 90 Seconds
XXX-------Cron Job 3 waiting til the next 1 minute interval starts
我担心的是,标记为XXX的时间段为30秒,无法运行cron作业。
我想要完成什么?我想无限期地每秒执行一次PHP脚本。它不必每秒运行一次,但它必须运行,结束,运行,结束,运行,结束。如果迭代需要5秒,则必须在第一次结束后才开始下一次迭代。但它永远不会停止。问题是我无法确定迭代的长度。一次迭代可能需要1秒,或者可能需要5秒,甚至更长。
答案 0 :(得分:2)
您可以实现一个简单的锁定机制,如下所示。
if(!locked()) {
lock();
// your code here
unlock();
} else {
echo "script already running";
}
function lock() { file_put_contents("write.lock", 'running'); }
function locked() { return file_exists("write.lock"); }
function unlock() { return unlink("write.lock"); }
答案 1 :(得分:1)
是。 cron启动工作,但不检查先前是否已完成。它没有管理任何作业队列。
答案 2 :(得分:0)
无论其他实例如何,它都会启动第二个进程。在您的脚本中,您可以检查已经运行的其他进程(例如,如果存在全局PID文件)或其他进程,具体取决于您的需求。
答案 3 :(得分:0)
第二次迭代是否会开始,直到第一次出现?
对于大多数Unix,默认使用Vixie cron,答案是“是”。
如何在执行PHP脚本的Linux系统上每秒获得一次真值?
问题很奇怪,请重新表述。但是,如果您希望同时运行每个脚本的单个实例,请使用/ usr / bin / flock或任何其他互斥工具。
答案 4 :(得分:0)
我最终使用supervisord来解决我的所有问题。
答案 5 :(得分:0)
您可以考虑“守护”您的脚本而不是使用cron:PEAR System Daemon
从那时起,您似乎需要构建一个简单的作业/任务/工作队列,并使用该守护进程相应地进行调度和锁定。