0

如果我有一个每分钟运行一次的 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

我担心会有一段 30 秒标记为 XXX 的时间段不会运行 cron 作业。

我想完成什么?我想无限期地每秒执行一个 PHP 脚本。它不必每秒运行一次,但它必须运行、结束、运行、结束、运行、结束。如果一个迭代需要 5 秒,它只能在第一个结束后开始下一个。但它绝不能停止。问题是我无法确定迭代的长度。一次迭代可能需要 1 秒,也可能需要 5 秒,甚至更长。

  1. cron可以做到这一点吗?这样我就可以保证脚本无论如何都会每秒运行一次?
  2. 如果不是,我怎么能保证一个 PHP 脚本无限期地运行,一个又一个迭代?
4

6 回答 6

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"); }
于 2013-04-18T15:42:14.767 回答
1

是的。cron 启动作业,但不检查先前启动是否已完成。它不管理任何作业队列。

于 2013-04-10T18:18:48.917 回答
0

我最终使用了supervisord,它解决了我所有的问题。

于 2013-04-11T02:05:11.957 回答
0

It will start a second process regardless of another instance. In your script you could check for other processes (e.g. if a global PID file exists) already running or something, depends on what you need exactly.

于 2013-04-10T18:17:43.707 回答
0

您可能会考虑“守护”您的脚本,而不是使用 cron:PEAR System Daemon

从那里开始,您似乎需要构建一个简单的作业/任务/工作队列,并使用守护进程相应地调度和锁定。

于 2013-06-24T22:19:11.760 回答
0

第二次迭代会开始直到第一次出现结束吗?

对于大多数 Unix 系统默认的 Vixie cron,答案是“是”。

如何在执行 PHP 脚本的 Linux 系统上获得真正的每秒间隔?

这个问题很奇怪,请重新表述。但是,如果您希望每个脚本的单个实例同时运行,请使用 /usr/bin/flock 或任何其他互斥工具。

于 2013-04-10T18:19:31.013 回答