У меня есть хостинг на hostgator, и я только что узнал, что они не разрешают * * * * * cron. Если у меня один запускается реже, чем каждые 15 минут, они меняют его на * / 17 или что-то в этом роде. Я искал, но не могу найти способ сделать это на моих собственных установках cPanel. Любые намеки на то, как это воспроизвести.
Примечание: я не ищу ответа, чтобы обойти это ограничение. Я пытаюсь выяснить, как реализовать это в моих собственных развертываниях.
Спасибо.
Мне неизвестен стандартный пакет, реализующий эту функцию.
Вы, конечно, можете создать корневое задание cron, которое проверяет и «исправляет» пользовательские cronjobs. Возьмем, к примеру, следующий сценарий - он в основном не тестировался, но работал с парой примеров, которые я ему привел.
#!/bin/bash
min=16 # the minimum allowed interval between runs
for crontab in /var/spool/cron/crontabs/*
do
cp $crontab $crontab.bak
# replace the * * * * * jobs with */16 * * * * jobs.
sed -i "s/\* \* \* \* \*/\*\/16 * * * */" $crontab
for i in `seq 1 $min`
do
# replace */N * * * * for every N <= min
sed -i "s/\*\/$i \* \* \* \*/*\/16 * * * */" $crontab
done
done
Это предполагает, что поля crontab разделены пробелами, что может быть неверным - я использовал это предположение, чтобы регулярное выражение (надеюсь) было понятным. Чтобы сделать его более надежным, замените все пробелы в левых регулярных выражениях на \s
, если ваш sed поддерживает это, или [ \t]+
(Я думаю) если нет.
Обратите внимание, что в этом примере для каждого crontab применяется 17 различных операций поиска и замены, что, конечно, будет недопустимо при увеличении количества crontab. Чтобы решить эту проблему, вы можете использовать одно регулярное выражение для сопоставления всех возможных cronjobs, нарушающих авторские права. Например, что-то вроде (непроверено): \*(/[0-9][0-5])* \* \* \* \*
или процедурно построенный с использованием вывода seq -s '|' 0 $min
. Дай мне знать, если тебе понадобится помощь.