Skip to content

Instantly share code, notes, and snippets.

@maxim-kravets
Last active August 5, 2020 18:54
Show Gist options
  • Save maxim-kravets/6c4c00ed2894c566a1a40c8eda359cdc to your computer and use it in GitHub Desktop.
Save maxim-kravets/6c4c00ed2894c566a1a40c8eda359cdc to your computer and use it in GitHub Desktop.

Cron

Содержание документа

Что такое cron?

Cron - популярный демон, планировщик заданий работащий в Unix системах. Название этой утилиты произошло от греческого слово 'хронос', что в переводе означает время. Он позволяет автоматически выполнять определенные действия, команды, скрипты на сервере с заданной переодичностью или в определенное время.

Зачем используется?

Этот инструмент может быть полезен для:

  • Отложенной рассылки писем
  • Создания бэкапов
  • Создания сводок базы данных
  • Парсинга данных со сторонних ресурсов и последующей актуализации базы данных
  • Планирования длительных задач таких как кодирование видео

и тому подобное.

Файл crontab

Все cron задачи, которые еще называют cron jobs, необходимо добавлять в файл crontab. Для взаимодействия с этим файлом используется команда crontab. Эта комманда имеет следующие опиции:

$ crontab -e - редактирование файла задач.

$ crontab -l - вывести список задач.

$ crontab -r - удалить все задачи.

$ crontab -u <username> { -l | -r | -e } - взаимодейтвие с файлом задач другого пользователя системы. Запускать команду с этой опцией можно только с правами суперпользователя.

Синтаксис задач

* * * * * команда 
| | | | |
| | | | --- день недели (0 - 6) (воскресенье = 0 или 7)
| | | ----- месяц (1 - 12)
| | ------- день месяца (1 - 31)
| --------- час (0 - 23)
----------- минута (0 - 59) 

Специальные символы:

  • Звездочка ( * )

    Звездочка указывает, что выражение cron соответствует всем значениям поля. Например, с помощью звездочки в 4-м поле (месяц) указывается каждый месяц.

  • Слэш ( / )

    Слэши описывают шаги. Например, 3-59 / 15 в 1-м поле (минуты) указывают на третью минуту часа и каждые 15 минут после этого. Форма «* / ...» эквивалентна форме «first-last / ...», то есть шаг по максимально возможному диапазону поля.

  • Запятая ( , )

    Запятые используются для разделения элементов списка. Например, использование «MON, WED, FRI» в пятом поле (день недели) означает понедельники, среды и пятницы.

  • Дефис ( - )

    Дефисы определяют диапазоны. Например, 2000-2010 годы указывается каждый год в период с 2000 по 2010 год, включительно.

Специальные строки

Вместо первых пяти полей можно использовать любую из восьми специальных строк. Это не только сэкономит время, но и улучшит читаемость.

  • @reboot - запускается только один раз при запуске.
  • @yearly - запускается раз в год, «0 0 1 1 *».
  • @annually - тоже самое, что и @yearly.
  • @monthly - запускается раз в месяц, «0 0 1 * *».
  • @weekly - выполняется раз в неделю, «0 0 * * 0».
  • @daily - выполняется один раз в день, «0 0 * * *».
  • @midnight - тоже самое, что и @daily.
  • @hourly - запускается один раз в час, «0 * * * *».

Советы

  1. Не использовать @reboot так как эта специальная строка очень часто работает некорректно. Детальнее.

  2. Некоторые реализации cron позволяют указывать года и секунды. Не следует оперировать этими уровнями так как cron далеко не лучший инструмент для этого.

  3. Запускайте ваши сервера и cron процессы во временной зоне UTC. Почему?

  4. Более сложные расписания можно реализовать комбинируя несколько выражений cron. Например, если вам нужно запускать скрипт каждые 90 минут, создайте одну запись crontab, которая запускает скрипт каждые 3 часа (0 * / 3 * * *), и вторую запись crontab, которая запускает скрипт каждые 3 часа со смещением (30 1/3 * * *).

  5. Если колонка дня месяца или дня недели начинается с *, они образуют пересечение. В противном случае они образуют союз. * * 3 * 1 выполняется в 3-й день месяца и в понедельник (объединение), тогда как * * * / 2 * 1 выполняется в каждый второй день месяца, только если это также понедельник (пересечение).

  6. Необходимо указывать абсолютный путь к скрипту cron задачи, а так же абсолютные пути в самом скрипте. В противном случае скрипт работать не будет или будет работать некорректно.

  7. Бывает случаи, когда cron перестает работать или задача выполнятся с ошибкой, что важно отслеживать. Для этого есть сервис healthchecks.io, который отправляет на почту уведомление, если задача перестала выполнятся.

Примеры

0 9-17 * * * command - в 0 минут каждого часа с 9 до 17.

0 2 * * * command - каждый день в 2am.

0 0 1 */3 * command - раз в квартал.

*/3 2,4 * * * command - каждые 3 минуты 2-го и 4-го часа.

Ссылки

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment