От какого пользователя запускается задача по расписанию?
От пользователя cron
.
Если два крона запускаются в одно и тоже время, то они будут запущены последовательно на одном ядре процессора или одновременно на разных (при их наличии)?
На разных — в разных процессах.
Если в одно и тоже время запускается больше задач, чем доступно процессорных ядер, то в каком порядке они будут выполнены?
В произвольном порядке. Не надо расчитывать на порядок выполнения кронов в одном тайм-слоте.
Таймаут на исполнение у кронов такой же, как и у остальных скриптов?
Да. Устанавливается в Conf.php
в корневой папке установки.
Если крон выпоняется дольше, чем интервал запуска, то к чему это приведет?
Крон следующего интервала наложится на предыдущий.
Пример использования глобальных переменных
Для того, чтобы исключить наложение крона на незавершенный предыдущий, используется комбинация глобальных переменных и функции globVar и tryCatch.
Общий подход такой:
Когда крон стартует, он записывает в глобальную переменную
контрольное значение.
Когда завершается — снимает это контрольное значение из переменной.
Когда стартует следующий по тайм-слоту крон — он проверяет переменную. Если там есть блокирующее значение, то завершается. Если переменная пустая, то записывает контрольное значение и начинает выполняться:
=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!