Когда интервальный cron запустится в первый раз? (Пример:*/3 дня)

Вы вызываете не -интерактивную оболочку для выполнения вашейfind-команды.

Не интерактивные -оболочки не имеют истории по умолчанию.

Возможные решения см. в Команда History внутри сценария bash .

13
31.07.2020, 15:01
2 ответа

В справочной странице crontab (5 )используется достаточно ясная формулировка:

Step values can be used in conjunction with ranges. Following a range with "/number" specifies skips of the number's value through the range. For example, "0-23/2" can be used in the hours field to specify command execution every other hour (the alternative in the V7 standard is "0,2,4,6,8,10,12,14,16,18,20,22"). Steps are also permitted after an asterisk, so if you want to say "every two hours", just use "*/2".

Точная формулировка (и пример )— «пропуск значения числа через диапазон» -и подразумевается, что оно начинается с первого числа в диапазоне.

Это означает, что если диапазон равен 1-31для дней, значения, возвращаемые в случае 1-31/2или */2, равны 1,3,5,7.. и т. д. Это также означает, что диапазон сбрасывается до начальное значение после его завершения.

Таким образом, вы также правы в том, что в этом случае cronjob будет запускаться как 31-го числа, так и 1-го числа следующего месяца.

Обратите внимание, что cron имеет 2 взаимоисключающих поля -"день месяца" и "день недели". Так что приходится выбирать то одно, то другое, при запуске заданий с интервалом в дни.

Если вы хотите определить задание cron, которое отлично работает через день, вы должны использовать несколько строк и определять каждый месяц в соответствии с текущим календарем.

7
18.03.2021, 23:16

Просто для тех, кто хотел бы посмотреть здесь код, это подтверждает вывод из других ответов.

cron.h определяет первый и последний возможные элементы различных типов (, таких как HOUR, MONTH, DAY ).

#define FIRST_HOUR  0
#define LAST_HOUR   23
#define HOUR_COUNT  (LAST_HOUR - FIRST_HOUR + 1)

#define FIRST_DOM   1
#define LAST_DOM    31
#define DOM_COUNT   (LAST_DOM - FIRST_DOM + 1)

#define FIRST_MONTH 1
#define LAST_MONTH  12
#define MONTH_COUNT (LAST_MONTH - FIRST_MONTH + 1)

В entry.c ' *' анализируется в диапазон с использованием этих ограничений

if (ch == '*') {
    /* '*' means "first-last" but can still be modified by /step
     */
    num1 = low;
    num2 = high;

Размер шага (num3 )по умолчанию равен 1, но его можно переопределить, если он присутствует в crontab

    ch = get_number(&num3, 0, PPC_NULL, ch, file);
    if (ch == EOF)
        return EOF;
} else {
    /* no step.  default==1.
     */
    num3 = 1;

И затем все допустимые элементы создаются путем итерации от первого до последнего с заданным размером шага. Таким образом, первый элемент всегда является началом диапазона.

/* range. set all elements from num1 to num2, stepping
 * by num3.  (the step is a downward-compatible extension
 * proposed conceptually by bob@acornrc, syntactically
 * designed then implmented by paul vixie).
 */
for (i = num1;  i <= num2;  i += num3)
    if (EOF == set_element(bits, low, high, i))
        return EOF;
2
18.03.2021, 23:16

Теги

Похожие вопросы