Я работаю над планировщиком командной строки, потому что мне нужно несколько раз запускать несколько команд друг за другом в разное время.Насколько надежным является «at»
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);
Во-первых, хрон запускает первый процесс, который после этого расписания другие команды, в зависимости от ответа API. Я должен запускать эти команды каждые две минуты, так что cron
как at
нередко увольняются. Хотя я знаю, что cron работает (и команды в файле работают так, как предполагается при вызове вручную), некоторые из заданий не выполняются/не выполняются.
Поскольку я не работал с at
с таким количеством заданий, я имею в виду, если at
такой же надежный, насколько мне нужно. Или у моего кода есть недостаток, которого я не вижу.
Итак, это вопрос к моему вопросу, имеет at
, который будет считаться надежным на огромном количестве заданий и должен ли я контролировать исходный код для ошибок или at
просто не должен считаться достаточно надежным для работы в чисто программно исполняемой среде?
Спасибо, это звучит очень разумно. Единственная точка входа - это то, о чем я думал очень долго, но я просто не могу найти эффективный способ, так как второй скрипт иногда должен запускаться 5, иногда через 10 минут после первого. Что-то хорошее приходит вам на ум, что может мне помочь? – baao
В этом случае вам действительно не нужно 'at'. вам просто нужно вычислить разницу времени до тех пор, пока задание не начнет повторять работу, и 'sleep()' за этот отрезок времени. например. cron запускает задание для его первого запуска, он выполняется в течение 15 минут, 3 секунд и должен снова запускаться через 30 минут после первого запуска, поэтому вы спите 14 минут и 57 секунд. –
@Marc B: Запуск демона не так прост. Вы также должны использовать fork, close stdio и setsid, не говоря уже о добавлении в обработчик сигнала. – symcbean