Как планировать задачи в Linux с помощью Cron и Crontab

Знаете ли вы, что Blade Runner установлен в 2019 году? Это через три года! Не говоря уже о Back to the Future 2, где они перемещаются во времени на 2015 год. Но у нас нет летающих автомобилей, и среди нас нет репликантов (насколько я знаю).

Linux-хрон-задания кавычка

Легко почувствовать себя разочарованным современными технологиями, если сравнить их с вымышленными изображениями будущего. Тем не менее, в наши дни наши телефоны, компьютеры и даже дома могут делать удивительные вещи

, Способность автоматизировать задачи является одним из них.

Каждый пользователь Linux может получить выгоду от планирования задач, независимо от того, связаны ли они с системой (например, очистка старых журналов и обновление пакетов).

) или обслуживание пользователя (проверка электронной почты, загрузка подкастов…). У пользователей Windows был Task Scheduler

начиная с Windows 95. Утилита, которая выполняет ту же работу в Linux, называется cron, и здесь мы объясним, как ее использовать.

Что такое Cron?

Cron — это системная служба, которая работает в фоновом режиме, проверяет запланированные задачи и выполняет их, если обнаружит. Задачи, также называемые «cron-заданиями»

»- определяются в специальных конфигурационных файлах (crontabs), которые cron сканирует каждую минуту. Несколько версий cron можно найти в разных дистрибутивах Linux. Например, форка cron в Fedora называется cronie, и есть также fcron, bcron и dcron. У некоторых есть дополнительные функции, в то время как другие больше сосредоточены на безопасности, но все они основаны на одной и той же идее.

Это руководство написано для vixie-cron, наиболее распространенной версии cron, которую вы найдете в Ubuntu и ее производных. Хотя большинство инструкций применимо и к другим реализациям cron, могут быть незначительные различия, поэтому проверьте их руководства, если вы решите переключиться.

Что такое Crontab?

Если вы серьезно относитесь к управлению своим временем, возможно, у вас есть какой-то календарь

— приложение или хотя бы лист бумаги. Crontab очень похож на календарь вашего компьютера. Он содержит информацию о запланированных задачах, сообщая cron, какие команды запускать и в какое время.

На самом деле, в вашей системе есть несколько crontabs. У каждого пользователя есть свой crontab, включая root (администратор). Пользовательские crontabs хранятся в / Вар / катушка / хрон / crontabs /. crontab -l Команда выведет список файла crontab для текущего пользователя. Вы можете проверить корневой crontab с помощью sudo crontab -l.

Кроме того, есть системный файл crontab / И т.д. / кронтаб который используется для общесистемных задач. Обычно они принимают форму исполняемых корневых скриптов, размещенных в /etc/cron.hourly/, /etc/cron.daily/, /etc/cron.weekly/, а также /etc/cron.monthly/ папки, а в некоторых дистрибутивах /etc/cron.d/ папка тоже. Вообще говоря, вам не нужно иметь дело с этими задачами, так как большинство из них создаются автоматически установленными приложениями.

Как планировать задачи с помощью Cron

Звучит просто: для планирования задач просто добавьте их в свой crontab. Поскольку crontab — это специальный файл конфигурации, редактировать его вручную не рекомендуется. Вместо этого используйте crontab -e команда. Чтобы отредактировать crontabs root или других пользователей, запустите команду с правами администратора и добавьте их имя пользователя после опции -u:

sudo crontab -u root -e
sudo crontab -u имя пользователя -e

Linux-хрон-работа-кронтаб-редактор

Файл crontab состоит из двух разделов. Первый содержит переменные среды, которые устанавливаются автоматически. Вы можете безопасно изменять переменные PATH, HOME и SHELL и изменять переменную MAIL.

Вторая часть файла — это фактическое «расписание» с вашими запланированными заданиями. Каждая задача занимает строку (строку) в таблице со столбцами, представляющими следующие значения:

Linux-хрон-работа-кронтаб

Чтобы успешно планировать задачи, вам нужно немного узнать о синтаксисе crontab:

  • Числа должны быть целыми числами (целыми числами), и вы можете использовать звездочку (*) в любом из столбцов в качестве подстановочного знака, что означает «каждую минуту / день / месяц…».
  • В столбце «День месяца» старайтесь не устанавливать дату, которая не встречается в месяце, указанном в столбце «Месяц» (например, 30 февраля).
  • Столбцы «Месяц» и «День недели» принимают короткие имена соответственно для месяцев и дней и нечувствительны к регистру.
  • В столбце «День недели» 0 и 7 обозначают воскресенье. Столбец «Час» требует формат «военного времени» (24 часа), но вы не можете использовать число 24 — вместо этого 0 означает 12:00. Это потому, что значения минут, часов и дня недели начинаются с 0 вместо 1.
  • Секунды не поддерживаются, поэтому вы не можете запланировать задачу на определенную секунду.

Что вы можете сделать, это запланировать интервалы времени с использованием дефиса (14-22 в разделе «Часы» будут запускать задачу непрерывно с 14:00 до 22:00) или выполнить одну задачу несколько раз, определив список через запятую (1, 3,5 в «День недели» будет запускать задание в понедельник, среду и пятницу).

Между тем, значения шага представлены косой чертой (/), и они указывают количество пропусков в пределах диапазона; например, 3-20 / 3 в разделе «Часы» будет запускать задачу каждые три часа с 3 до 8 часов. Это полезно, когда вы хотите повторять задачи каждые X часов, потому что вы можете объединить звездочку и шаг (* / X). Вы можете комбинировать диапазоны со списками и шаги с диапазонами, если вы используете числа. Другими словами, такие комбинации, как «джан-мар» или «вт, пт-вс» не допускаются.

В качестве альтернативы, вместо установки значения для каждого столбца, вы можете просто написать @weekly, @yearly, @monthly, @daily или @hourly в начале строки, а затем команду. Запланированные так, задачи будут запускаться при первой возможности, поэтому @weekly будет выполняться в полночь первого дня недели. Если вы хотите запустить задачу сразу после запуска системы (re), используйте команду @reboot.

Linux-хрон-работа-кронтаб-пример

В этом примере мы запланировали резервное копирование каждый день на 08:20 и 20:20. Обои меняются автоматически каждые три дня в 19:00, и скрипт проверяет наличие новых подкастов.

каждый понедельник в 10:20 и 20:20. Напоминание о дне рождения назначено на 25 марта и выполняется каждые 30 минут в течение указанного периода времени. Наконец, скрипт проверяет электронную почту каждые 15 минут с 8 до 20, но только в рабочие дни. Вы можете свободно организовывать свой crontab с пробелами и табуляциями между столбцами, но не внутри них (не ставьте пробелы между запятыми, дефисами и косыми чертами).

Если все это звучит слишком сложно, не волнуйтесь — вы всегда можете положиться на Интернет. Такие инструменты, как Crontab Generator, Crontab.guru и Corntab, помогают создавать задания cron, не зная синтаксиса crontab. Они показывают, когда задание будет выполнено следующим, и предоставляют шаблоны для часто используемых выражений. Crontab.guru — лучший из всех, потому что он позволяет вам протестировать синтаксис crontab в режиме реального времени, чтобы вы могли сразу увидеть, как ваши изменения повлияют на расписание.

Linux-хрон-работа-кронтаб-гуру

Как проверить, выполняются ли задания Cron

Предполагается, что Cron работает тихо в фоновом режиме и позволяет вам работать без помех, пока он выполняет ваши задачи. Но как вы можете убедиться, что это на самом деле работает?

Cron имеет встроенную функцию уведомления по электронной почте, но для этого требуется настроить хотя бы простой локальный почтовый сервер

, Не многие домашние пользователи желают настроить это, и не многие дистрибутивы предоставляют его по умолчанию (например, Ubuntu этого не делает). Самый быстрый способ проверить cron — это просмотреть системный журнал с помощью этой команды:

cat / var / log / syslog | grep -i cron

Linux-хрон-работа-журнал

Опция -i делает наш запрос нечувствительным к регистру. Возможно, что у cron будет свой собственный файл журнала где-то в / Вар / Журнал /, так посмотрите, если эта команда не дает полезных результатов.

Если вам нужно сохранить вывод определенного задания cron, вы можете перенаправить его в файл. Укажите путь и имя файла в последнем столбце вашего crontab после команды, которую вы хотите выполнить:

30 * * * * / usr / bin / yourcommand> /home/username/logfile.txt

Использование одного символа> перезапишет файл при каждом запуске команды. Чтобы избежать этого, используйте >> вместо — он добавляет вывод в существующий файл.

Что делать, если Cron не работает?

Может случиться так, что вы добавили некоторые задачи, проверили системные журналы и обнаружили, что они не выполняются должным образом. Вот некоторые вещи, которые вы должны учитывать — и быть осторожными — при попытке решить проблему.

Служба cron запущена?

Как вы знаете, демон cron должен работать в фоновом режиме. Убедитесь, что это действительно так. Сервис называется crond или просто cron.

Для дистрибутивов, использующих systemd:

системный статус cron

Для дистрибутивов, использующих Upstart:

статус службы cron

Linux-хрон-работа-сервис-статус

Если ваш дистрибутив использует «старый» подход System V init, перечислите все сервисы с:

список initctl

и посмотрите, есть ли в списке cron.

Вам даже разрешено иметь файл crontab?

Проверьте свои /так далее папка для файлов с именем cron.allow а также cron.deny. В Ubuntu ни один из них не должен существовать, что означает, что всем пользователям разрешено управлять заданиями cron. Однако, если есть cron.allow файл, он должен содержать ваше имя пользователя. И наоборот, если cron.deny файл существует, ваше имя пользователя не должно быть в нем. Покидая cron.deny пустой файл означает, что только root и пользователи, перечисленные в cron.allow может иметь файлы crontab.

Ваши переменные установлены правильно?

Crontab автоматически устанавливает переменную SHELL в / Бен / ш. Тем не менее, если ваш выбор — рыба

или bash, вы должны изменить переменную SHELL. Аналогично, переменная PATH по умолчанию содержит только несколько каталогов. Именно здесь crontab ищет команды Linux. Если ваша задача cron не запускается, это может быть из-за того, что crontab не «видит» команду, которую вы использовали. Чтобы избежать этого, добавьте каталоги, содержащие команды, в переменную PATH, разделенные двоеточиями:

PATH = / Opt / MyApp / бен: / USR / местные / SBIN: / USR / местные / бен: / USR / SBIN: / USR / бен: / SBIN: / бен

Если вы не хотите редактировать это в вашем crontab, вы можете определить эти переменные в скрипте, который вы хотите запустить как задание cron.

Ваш crontab форматируется?

Синтаксис Crontab не совсем гладко. Даже если вы подтвердите это с помощью онлайн-инструментов, упомянутых ранее, незначительная ошибка может помешать cron выполнять ваши задания. Будьте осторожны с:

  • добавить пустую строку в конце файла crontab
  • экранируйте знак% обратной косой чертой, если ваша команда включает его
  • писать комментарии в виде отдельных строк, начинающихся с #. Не пишите комментарии в той же строке, что и переменные окружения, или рядом с командами задания cron.

Вы действительно должны использовать терминал?

Точно нет. Пользователи KDE могут планировать задания cron с помощью KCron, который доступен из Настройки системы> Планировщик задач модуль. С простым интерфейсом, который позволяет вам выбирать и настраивать все всего лишь несколькими щелчками мыши, KCron приятно использовать.

Linux-хрон-рабочие-KCron

Если вы предпочитаете GNOME, то расписание GNOME для вас. Подход аналогичен, хотя интерфейс, как ожидается, немного отличается. Он предлагает расширенный режим для мелкозернистых изменений и поставляется с апплетом панели, из которого вы можете напрямую управлять задачами.

Linux-хрон-работа-гном-график

Вы должны знать о других решениях, таких как Crontab-UI и Minicron. Они больше подходят для пользователей, которые управляют несколькими машинами и задачами cron, и одной из их самых крутых функций является веб-интерфейс.

Linux-хрон-рабочие-crontabui

Есть ли альтернативы Cron?

Хотя cron в значительной степени стандартный планировщик задач для Linux

это, конечно, не единственный. Команда at идеально подходит для быстрых одноразовых заданий, которые можно запланировать прямо из командной строки, без специальных файлов конфигурации. Если вам нужно больше, есть GNUbatch, который вводит понятие зависимости. С GNUbatch вы можете установить конкретные условия для каждой работы или сделать запланированную задачу зависимой от предыдущей. Нечто подобное можно достичь с помощью системных таймеров. Хотя таймеры systemd менее удобны в настройке, чем cron, системные запоминающие устройства могут помнить, пропустила ли задача расписание, когда компьютер был выключен, и запускать его при следующем включении.

Это то, что cron не может сделать в одиночку. Таким образом, он подходит для серверов и компьютеров, которые постоянно работают, но он не будет выполнять работу, которая была запланирована, когда компьютер был выключен. Это где анакрон вступает в игру. Технически это не «альтернатива» или замена cron. Вместо этого anacron дополняет cron и должен использоваться вместе с ним, что имеет место во многих дистрибутивах Linux, включая продукты на основе Ubuntu и Ubuntu. Anacron регистрирует время последнего выполнения задачи и проверяет наличие пропущенных экземпляров при выключении системы. Он будет запускать их при включении компьютера, но каждую задачу можно выполнять только один раз в день.

Некоторые версии cron, такие как fcron, по умолчанию предоставляют функции anacron. Опытные пользователи, возможно, захотят взглянуть на Hcron или SuperCron, которые вносят множество улучшений в базовые функции cron, но в то же время являются сложными в управлении.

Как насчет вас? Как вы организуете свои цифровые задачи? Какие задачи вы планируете в Linux? Поделитесь своими историями и советами по использованию cron в комментариях.

Image Credit: доска объявлений от Гонсало Арагона через Shutterstock

Ссылка на основную публикацию