0

我正在使用命令行调度程序,因为我需要在不同时间在几分钟之后运行多个命令。

public static function set ($dir, $operation, $arguments = [], $options = [], $timeToWait)
{

    $argumentstring = '';
    $optionstring = '';

    foreach($arguments as $argument)
    {
        $argumentstring .= $argument.' ';
    }

    if ($options) 
    {
        foreach ($options as $key => $option) 
        {
            $optionstring .= '--' . $key . '=\"' . $option . '\" ';
        }
    }

    $command = $operation. ' ' . $argumentstring . ' ' . $optionstring;
    return $string = exec('echo php '.$dir.'/./prices '.$command.' | /usr/bin/at -M now + '.$timeToWait. ' min');
}

叫像

Schedule::set(getcwd(), 'put:acknowledge', ['Customer' => database_connector::getUserId(), 'ReportId' => ReportIdDeclaration::getReportID(), [], 5);

首先,cron 运行第一个进程,然后根据 API 响应调度其他命令。我必须每两分钟运行一次这些命令,cron而且at经常被解雇。虽然我知道 cron 正在工作(并且文件中的命令在手动调用时按预期工作),但某些作业失败/未执行。

由于我还没有从事过at这么多工作,所以我怀疑它是否at像我需要的那样可靠。或者我的代码缺少我看不到的东西。

所以这就是我的问题的重点,必须at被认为在大量工作中是可靠的,我是否必须控制我的源代码的错误,或者 at只是不被认为足够可靠以在纯粹的程序执行环境中工作?

4

1 回答 1

1

我们不知道您需要“at”有多可靠,但是您所描述的似乎是使用 at 的一种反模式。

如果您需要按顺序运行作业,则应将它们链接在具有单个入口点的脚本中。

虽然“at”通常会以 1 秒的精度运行任务,但不能保证任务将始终在计划的 1 秒内运行。如果您需要那种程度的确定性,那么您需要一个实时操作系统。

如果负载超过某个阈值,某些版本的“cron”和“at”将不会启动作业。除了那种情况,我从来不知道“at”会接受(最终)不是由 atd 运行的工作。

当然,最近的系统可能不使用 atd 和 crond - systemd 支持此功能(是否有效以及它是否是一个好主意是一个很长的争论)。

您在此处向我们展示的代码不会检查调用“at”的返回码。

于 2015-02-01T22:22:53.700 回答