⟵ сюдатуда ⟶
  • Учебный курс
  • Создание простых таблиц и полей
  • Коды базовый уровень
  • Селекты и связь между таблицами
  • Настройки таблиц базовый уровень
  • Префильтры базовый уровень
  • Условное форматирование базовый уровень
  • Коды действия базовый уровень
  • Использование всплывающих окон
  • Циклы базовый уровень
  • Роли и пользователи в web
  • Коды продвинутый уровень
  • Коды действий продвинутый уровень
  • Префильтры продвинутый уровень
  • Настройки полей и таблиц продвинутый уровень
  • Циклы продвинутый уровень
  • Форматирование продвинутый уровень
  • Селект-дерево
  • Выполнения кода действия по расписанию
  • Общее
  • Последовательность и наложение запущенных кронов
  • Печать и отправка email
  • Нотификации
  • Взаимодействие по API
  • Адаптивность и секции
  • Графики
  • Вид таблицы панелями и поворот строчной части
  • Анонимные таблицы для неавторизованного доступа
  • Внешние формы для сбора информации
  • Обновление и бэкапирование
  • Дублирование схем и перенос таблиц между базами
  • Консольная утилита bin/totum
  • Последовательность и наложение запущенных кронов

    От какого пользователя запускается задача по расписанию?

    От пользователя cron.

    Если два крона запускаются в одно и тоже время, то они будут запущены последовательно на одном ядре процессора или одновременно на разных (при их наличии)?

    На разных — в разных процессах.

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

    В произвольном порядке. Не надо расчитывать на порядок выполнения кронов в одном тайм-слоте.

    Таймаут на исполнение у кронов такой же, как и у остальных скриптов?

    Да. Устанавливается в Conf.php в корневой папке установки.

    Если крон выпоняется дольше, чем интервал запуска, то к чему это приведет?

    Крон следующего интервала наложится на предыдущий.

    Пример использования глобальных переменных

    Для того, чтобы исключить наложение крона на незавершенный предыдущий, используется комбинация глобальных переменных и функции globVar и tryCatch.

    Общий подход такой:

    1. Когда крон стартует, он записывает в глобальную переменную контрольное значение.

    2. Когда завершается — снимает это контрольное значение из переменной.

      • Если завершается с ошибкой — то тоже снимает.
    3. Когда стартует следующий по тайм-слоту крон — он проверяет переменную. Если там есть блокирующее значение, то завершается. Если переменная пустая, то записывает контрольное значение и начинает выполняться:


    =catch:
    if(condition: $var0 = 0; condition: $control[value] != true; then: $start; else: $control_time) var0: var(name: "inner"; value: 0) ~control: globVar(name: "contol_crone"; block: 10; date: true) control_time: if(condition: $dateadd < $#ndt; then: $start) dateadd: dateAdd(date: $df; minutes: 10; format: "Y-m-d H:i") df: strPart(str: $control[date]; length: 16) start: while(preaction: $set_control; preaction: $var1; action: "...."; postaction: $clear_control) set_control: globVar(name: "contol_crone"; value: true) var1: var(name: "inner"; value: 1) clear_control: globVar(name: "contol_crone"; value: false) catch: if(condition: $#inner = 1; then: $clearGlob) clearGlob: globVar(name: "contol_crone"; value: false)

    Запись globVar идет вне транзакционной модели, поэтому для того, чтобы переменная не зависла при ошибке мы ее ставим в false при помощи tryCatch!