如何确保从队列作业开始的进程在超时后终止?

时间:2019-07-18 01:29:48

标签: php yii2 jobs

我在终止从队列作业开始的进程时遇到问题。

我使用yii2-queue扩展来运行一些长时间运行的系统命令,这些命令的总执行时间受RetryableInterface的getTtr方法控制。该命令可能需要几分钟到几小时才能完全完成,但是我需要在达到60分钟标记后将其杀死。

    <?php

    use Symfony\Component\Process\Process;
    use yii\base\BaseObject;
    use yii\queue\RetryableJobInterface;

    class TailJob extends BaseObject implements RetryableJobInterface
    {
        public function getTtr()
        {
            return 10;
        }

        public function execute($queue)
        {
            $process = new Process('tail -f /var/log/dpkg.log');
            $process->setTimeout(60);
            $process->run();
        }

        public function canRetry($attempt, $error)
        {
            return false;
        }
    }

现在,我面临的问题是,即使queue/listen终止了工作,tail命令(仅是示例;在生产环境中,我需要运行其他命令)仍在运行背景。有什么办法可以迫使系统在作业被终止时终止tail命令?

2 个答案:

答案 0 :(得分:0)

您的脚本需要继续检查是否已达到超时;例如

while($process->isRunning()) {
    $process->checkTimeout();
    usleep(200000);
}

在此处详细了解“处理超时”: https://symfony.com/doc/current/components/process.html

答案 1 :(得分:0)

运行超时命令

$process = new Process('timeout 3600 tail -f /var/log/dpkg.log');

将整个过程限制为最多60分钟。

如果您的脚本先杀死它,那还好,否则,该进程将在超时时间终止。

https://linux.die.net/man/1/timeout

相关问题