我在终止从队列作业开始的进程时遇到问题。
我使用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
命令?
答案 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分钟。
如果您的脚本先杀死它,那还好,否则,该进程将在超时时间终止。