Руководство для начинающих по использованию Cron в Linux

Cron — это простая утилита UNIX, которая управляет и планирует выполнение команд на вашем компьютере. Она была впервые разработана в 1987 году Полом Викси и с тех пор стала незаменимым инструментом в системах на основе Linux как для администраторов, так и для пользователей.
В настоящее время существует множество реализаций и переработок cron, которые вы можете легко установить в своей системе Linux. Несмотря на различия, все эти программы имеют одно общее — происхождение от Vixie Cron.
Таким образом, цель данной статьи — предоставить общее представление о том, как работает оригинальный cron от Vixie, его синтаксис и как вы можете использовать его для планирования задач в вашей системе Linux.
Содержание
- Как работает Cron?
- Crontab: Сердце Cron
- Системные Crontab
- Обзор активности cron
- Часто задаваемые вопросы
Также читайте: Как легко создать задания Cron в Linux с помощью Zeit
Как работает Cron?
Cron — это невероятно простая утилита UNIX. Она работает в двух частях. Сначала Cron запускается как фоновый процесс, который начинает работу при загрузке вашей системы.
После этого он читает определённый файл каждую минуту. Этот файл содержит список команд, который, в свою очередь, состоит из временного кода и пути к файлу для каждого скрипта или программы, которую вы хотите запустить.

Такой подход позволяет cron быть невероятно гибким в больших системах. Например, современные реализации cron, такие как Cronie, запускают лишь один экземпляр cron, даже если на этом компьютере работает несколько пользователей.

Cronie делает это возможным, предоставляя локальные crontab для каждого пользователя, установленного в системе. Таким образом, cron нужно знать только, кто владеет crontab, уровень разрешений этого пользователя и команды внутри crontab.
Это не только делает систему более эффективной, но и более безопасной, уменьшая количество привилегированных программ, работающих в памяти.
Crontab: Сердце Cron
Каждая реализация cron использует какую-то форму crontab. Это простой текстовый файл, который содержит все команды, которые cron будет выполнять для данного пользователя. Как уже упоминалось, у каждого пользователя в системе есть свой собственный crontab. Он может просмотреть его, выполнив следующую команду:
crontab -l
Это выведет содержимое crontab текущего пользователя на стандартный вывод. Это может быть невероятно полезно, если вы просто хотите быстро увидеть, какие команды cron выполняет для этого пользователя.
Чтобы отредактировать его, вам нужно выполнить команду:
crontab -eЭто скажет cron запустить ваш текстовый редактор по умолчанию и загрузить файл crontab внутри него. Это позволит вам редактировать файл crontab.

Также читайте: Как использовать таймеры Systemd в качестве замены Cron
Синтаксис Crontab
Синтаксис файла crontab невероятно прост. Одна строка в этом файле указывает соответствующую команду, которую нужно выполнить для данного пользователя. Общая форма команды crontab выглядит следующим образом:
m h d mon dow [flags]commandВременной интервал — это поле из пяти цифр, где вы можете сообщить cron, как часто вы хотите выполнять команду. Это основная функция любой реализации cron, и она позволяет вам быть как конкретным, так и гибким в том, как cron обрабатывает повторяющиеся задачи.
- m = минуты от 0 до 59
- h = часы от 0 до 23
- d = день месяца от 1 до 31
- mon = месяц от 1 до 12
- dow = день недели от 0 до 6. Ноль — это воскресенье.
Поле flags представляет собой набор опций, которые изменяют поведение cron для одной команды. Например, вы можете включить опцию -n, чтобы предотвратить отправку письма системы cron.
Поле command — это команда, которую cron будет выполнять через установленные интервалы. Это может быть либо shell-скрипт, который вы написали, либо путь к программе с флагами.

Зная это, вы можете использовать все эти элементы вместе в одной строке crontab для создания конкретных временных интервалов для ваших задач. Например, я могу запускать скрипт на своей системе Ubuntu каждый 24 июля в 2:30 ночи, написав следующую строку crontab:
302247*/home/$USER/myscript.sh
Примечание: Рекомендуется запускать задание cron в “неконвенциональное” число минут (11, 27, 34 и т. д.), чтобы избежать наложения различных заданий cron друг на друга.
Короткие коды
Crontab позволяет использовать несколько коротких кодов, чтобы сделать ваши записи cron более читаемыми.
@reboot— Выполнить один раз при запуске@yearly— Выполнить один раз в год, “0 0 1 1 *”@annually— то же самое, что и @yearly@monthly— Выполнить один раз в месяц, “0 0 1 “@weekly— Выполнить один раз в неделю, “0 0 0”@daily— Выполнить один раз в день, “0 0 *”@midnight— то же самое, что и @daily@hourly— Выполнить один раз в час, “0 “
Например:
@daily ramces /home/ramces/.scripts/file-backup.shС помощью кода @reboot вы можете создать скрипты для выполнения при запуске:
@reboot /home/ramces/.scripts/bootup.shЭто может быть невероятно полезно, если вы хотите создать способ, чтобы гарантировать запуск команд сразу после включения машины.
Примечание: В зависимости от настройки вашей системы код @reboot может работать или не работать так, как задумано.
Системные Crontabs
Еще одной замечательной особенностью cron является то, что он может управлять повторяющимися системными задачами, так как вы также можете создавать файлы crontab для root. Это может быть невероятно полезно, если вы хотите автоматизировать техническое обслуживание и обновления системы.
Чтобы создать crontab для root, вам просто нужно использовать sudo с командой или войти в свою учетную запись root:
sudo crontab -e
Системный crontab в основном следует тому же формату, что и пользовательский crontab. Однако одним из ключевых отличий между ними является то, что crontab для root позволяет выполнять команды от имени любого пользователя в системе:
m h d mon dow user [flags]"command"Зная это, вы можете использовать это для создания как пользовательских, так и root-заданий в одном crontab:
302 sun root /bin/apt update
305* ramces /home/ramces/.scripts/file-backup.shТаким образом, я могу сохранить разрешения своих файлов, а также иметь одно место, где я могу редактировать команды, которые хочу выполнять.

Также читайте: Почему и как редактировать файл sudoers в Linux
Редактирование записей cron от имени другого пользователя
Если вместо редактирования crontab в качестве пользователя root вы хотите запланировать задание cron от имени другого пользователя, это также возможно с помощью флага -u.
sudo crontab -u имя_пользователя -eНапример, чтобы запустить задание cron от имени пользователя “www-data”, используйте следующую команду:
sudo crontab -u www-data -eТакже читайте: Как сохранить вывод терминала в файл в Linux
Обзор активности cron
Хотя вы теперь готовы запускать конкретные команды или скрипты, вам может потребоваться убедиться, что они были выполнены. Встроенный в cron механизм отправляет владельцу cron электронное письмо после выполнения команды. Это можно изменить с помощью переменной “MAILTO”.

Добавление [email protected] отсылает все отчеты по заданиям cron на указанный адрес электронной почты. Эта переменная обычно находится в самом верхнем поле экрана редактирования crontab. Однако, если ее там нет, вы можете добавить переменную, и она будет работать как задумано.
Несколько адресов электронной почты можно разделять запятой. Если вам нужно отправить другое задание по электронной почте на другой адрес, вы можете добавить команду MAILTO непосредственно над командой. Команды после этого MAILTO будут отправлены на новый адрес. Если вы оставите MAILTO= пустым, уведомления будут отправлены владельцу записи cron.
Если вы не хотите получать никакие электронные письма, вы также можете проверить журналы cron. На большинстве систем для доступа к журналам cron потребуется права суперпользователя. Журнал cron можно найти в директории “/var/log”. Файл cron или syslog будет отображать журнал выполненных записей cron.
sudo grep crontab syslogЧасто задаваемые вопросы
Почему моя команда cron выполняется каждую минуту, а не раз в час?
Это одна из самых распространенных ошибок при управлении crontabs. По умолчанию добавление значения звездочки в временной код означает, что оно будет выполняться для каждого возможного случая этого значения. Например, значение 0 12 * * * сообщит cron, что вы хотите выполнять команду один раз в день в 12:00.
Однако большинство новичков часто пишут тот же временной код как * 12 * * *. Написание таким образом означает, что команда будет выполняться каждую минуту с 12:00 до 12:59. Таким образом, хорошей практикой является указание 0 в поле минут, чтобы гарантировать, что команда выполняется только один раз.
Есть ли другие опции, которые я могу использовать с cron?
Кроме переменных -n и MAILTO, вы также можете использовать команду -s, чтобы указать программе быть строгой к выполнению команд. Использование этой опции заставит cron сосредоточиться только на текущей команде, пока она не завершится. Это может быть невероятно полезно, если ваша машина использует набор команд, которые должны выполняться в определенном порядке.
Вы также можете использовать переменную SHELL, чтобы заставить cron использовать другую оболочку для выполнения команд. Например: SHELL=/bin/ksh