PHP, crontab, DateInterval: преобразовать читаемый человеком интервал в формат crontab - PullRequest
2 голосов
/ 24 февраля 2011

У меня небольшая путаница с форматом интервалов crontab.Дело в том, что я хочу получить интервалы из понятных человеку строк, таких как «20 минут», «16 часов и 30 минут».Это делается PHP DateTime уже .Но мне нужно передать строку crontab-valid как exec(sprintf('echo "%s %s %s * * %s" | crontab', $minute, $hour, $day, $command));.В любом случае, вот пример PHP-скрипта

<?php
function getCrontabInterval($timestring)
{
    $interval = DateInterval::createFromDateString($timestring);

    $minute = $interval->i > 0 ? "*/{$interval->i}" : '*';
    $hour = $interval->h > 0 ? "*/{$interval->h}" : '*';
    $day = $interval->d > 0 ? "*/{$interval->d}" : '*';
    $crontab = sprintf('echo "%s %s %s * * %s" | crontab', $minute, $hour, $day, '%command%');

    echo "Days:\t\t", $interval->d, "\n",
        "Hours:\t\t", $interval->h, "\n",
        "Minutes:\t", $interval->i, "\n",
        "COMMAND:\t", $crontab, "\n";
}


 getCrontabInterval($_SERVER['argv'][1]);

и его вывод:

serge@serge-laptop:~/www/bin$ php periodical.php '2 hours 25 minutes'
Days:       0
Hours:      2
Minutes:    25
COMMAND:    echo "*/25 */2 * * * %command%" | crontab

Итак, будет ли команда cron со значением * / 25 * / 2 * * * соответствовать рабочей команде EACH2 часа 25 минут?Или это должно быть что-то вроде "0/25 0/2 * * *"?Мне было не понятно из manpages.А как действовать с днями?

UPD: под каждым "2 часа 25 минут" я имею в виду бег в 0:00, 2:25, 4:50, 7:15 и т. Д.

РЕШЕНИЕ: использовалось двухкомпонентное значение для интервалов с некоторой ручной рекомендацией использовать такие значения, как 20 минут, 3 часа, 4 дня и т. Д.

Ответы [ 2 ]

2 голосов
/ 24 февраля 2011

*/25 */2 * * * означает в 0:00, 0:25, 0:50, 2:00, 2:25, 2:50, 4:00, 4:25, 4:50 и т. Д. ...

25 */2 * * * означает 0:25, 2:25, 4:25, 6:25 и т. Д. ...

0/25 0/2 * * * означает только 0:25

РЕДАКТИРОВАТЬ - После вашего обновления

Насколько мне известно, нет способа сделать это с одной строкой в ​​crontab.Механизм указания времени выполнения задания cron не предназначен для такого рода сложности.Тем не менее, вы можете иметь 9 или 10 записей в вашем crontab с разным временем для одного и того же скрипта, если вам действительно нужна эта функция 2h25

1 голос
/ 24 февраля 2011

Строка "* / 25 * / 2 * * *" будет запускать команду каждые 2 часа КАЖДЫЙ 25 минутСтрока «25 * / 2 * * *» будет запускать команду каждые 2 часа 25 минут

...