停止通过cron作业运行的并发php作业

停止通过cron作业运行的并发php作业,php,shell,cakephp,cron,queue,Php,Shell,Cakephp,Cron,Queue,我正在使用Queuesadilla作业队列插件来管理一些繁重的任务,比如从excel中提取数据等等。我使用cron作业以一定的间隔运行shell命令。但是,如果队列中列出了多个作业;shell命令在不等待前一个作业的结束或失败的情况下启动下一个作业的工作进程。因为我想以5秒的时间间隔运行shell命令,有些作业需要3分钟才能完全运行;我希望工人等待前一项工作完成,然后再开始 但是,当我使用bin/cake CustomQueuesadilla运行cronjob时;显然,它从一个新的PID开始,依

我正在使用Queuesadilla作业队列插件来管理一些繁重的任务,比如从excel中提取数据等等。我使用cron作业以一定的间隔运行shell命令。但是,如果队列中列出了多个作业;shell命令在不等待前一个作业的结束或失败的情况下启动下一个作业的工作进程。因为我想以5秒的时间间隔运行shell命令,有些作业需要3分钟才能完全运行;我希望工人等待前一项工作完成,然后再开始

但是,当我使用
bin/cake CustomQueuesadilla
运行cronjob时;显然,它从一个新的PID开始,依此类推,而不知道前一个PID是否仍在运行。当我将worker的运行时间设置为20秒,并将cron作业间隔设置为3分钟时;我每三分钟就有一份工作。但这也意味着如果没有作业,它将等待3分钟-20秒再次运行。我想缩短这个时间窗口

我对体系结构的变化和不同的库也持开放态度

队列与Cron 您试图实现的是一个循环队列。Cron仅用于计划的事件

  • 构建您的队列管理器/工作器
    • 这个工人
    • 这些调用应该包装在try/catch中,并检查退出代码
    • 您可能应该记录每个调用的
      (时间、命令[、错误])
    • 将其构建为单体
  • 添加一个cron条目来调用获取管理器(singleton)的命令。
    • 作为单例模式的结果,如果它停止,它将再次启动
    • 除非您将队列的状态存储在该管理器(文件或数据库)之外,否则它可能会在cmd4(例如)中始终失效,并且永远不会运行后续命令
  • 前任经理 Cron命令以确保队列正在运行 大约每小时向cron添加一次此命令,并且仅将此命令添加到cron。运行此命令时,如果命令已停止,它将再次启动

    class QueueLoopCommand extends Command
    {
        ...
    
        public function execute(InputInterface $input, OutputInterface $output)
        {
            $queueLoop = CommandQueueLoop::getInstance($this->getApplication(), $input, $output);
        }
    }
    
    这里有龙 这个“管理器”需要非常仔细地编写,具有良好的日志记录和某种紧急停止。此外,Cron命令应该调用“管理器”中其他方法的主机,以检查状态、上次运行、重复检查多个线程等,并对意外状态进行处理。像这样的建筑工具很快就会深入到地下,会把你带进你无法相信的兔子洞

    主要危险:

    • 内存泄漏
    • 多个冲突线程
    • 非预期竞争条件
    队列与Cron 您试图实现的是一个循环队列。Cron仅用于计划的事件

  • 构建您的队列管理器/工作器
    • 这个工人
    • 这些调用应该包装在try/catch中,并检查退出代码
    • 您可能应该记录每个调用的
      (时间、命令[、错误])
    • 将其构建为单体
  • 添加一个cron条目来调用获取管理器(singleton)的命令。
    • 作为单例模式的结果,如果它停止,它将再次启动
    • 除非您将队列的状态存储在该管理器(文件或数据库)之外,否则它可能会在cmd4(例如)中始终失效,并且永远不会运行后续命令
  • 前任经理 Cron命令以确保队列正在运行 大约每小时向cron添加一次此命令,并且仅将此命令添加到cron。运行此命令时,如果命令已停止,它将再次启动

    class QueueLoopCommand extends Command
    {
        ...
    
        public function execute(InputInterface $input, OutputInterface $output)
        {
            $queueLoop = CommandQueueLoop::getInstance($this->getApplication(), $input, $output);
        }
    }
    
    这里有龙 这个“管理器”需要非常仔细地编写,具有良好的日志记录和某种紧急停止。此外,Cron命令应该调用“管理器”中其他方法的主机,以检查状态、上次运行、重复检查多个线程等,并对意外状态进行处理。像这样的建筑工具很快就会深入到地下,会把你带进你无法相信的兔子洞

    主要危险:

    • 内存泄漏
    • 多个冲突线程
    • 非预期竞争条件

    通常,队列工作程序应始终在后台运行,您不必多次启动它。这样,无论你排队的是什么,都会在同一个队列上。理想情况下,当cron任务触发时,它应该在现有队列工作器上对作业进行排队。@apokryfos有意义。但是,在这种情况下,如何检测队列故障并使其重新启动呢?我不知道,我对CakePhp或您正在使用的库不是很有经验。我知道Laravel的队列系统将失败放入
    failed_jobs
    表中,并可以选择重试。这里可能有一个类似的概念。通常,队列工作程序应该始终在后台运行,您不必多次启动它。这样,无论你排队的是什么,都会在同一个队列上。理想情况下,当cron任务触发时,它应该在现有队列工作器上对作业进行排队。@apokryfos有意义。但是,在这种情况下,如何检测队列故障并使其重新启动呢?我不知道,我对CakePhp或您正在使用的库不是很有经验。我知道Laravel的队列系统将失败放入
    failed_jobs
    表中,并可以选择重试。也许这里有一个类似的概念。我试图避免使用类似于supervisor的东西来使代码在不同的服务器上易于管理,但所有的建议都与您的非常相似。所以我检查了它作为答案。我试图避免使用类似于supervisor的东西来使代码在不同的服务器上易于管理,但所有的建议都与您的非常相似。所以我把它作为答案检查了一下。