Назад | Перейти на главную страницу

Ограничить использование cron

У меня есть хостинг на 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. Дай мне знать, если тебе понадобится помощь.