systemd

Cron нового поколения с systemd Создание таймера

Cron нового поколения с systemd Создание таймера
Вам нужно запланировать какое-то задание на будущее на вашем компьютере?? Это может показаться простым - в конце концов, ваша посудомоечная машина может ждать перед запуском с помощью кнопки - но иногда компьютеры выполняют такие простые задачи так трудно.Но если у вас есть опыт, вы, вероятно, слышали о cron, это программное обеспечение, полностью посвященное запуску нужной задачи в нужное время. Но этот инструмент действительно был разработан с учетом простоты, и в конечном итоге у вас могут быть неприятные сюрпризы.Если вам когда-либо удавалось запланировать задачу в Windows, вы использовали Планировщик задач Windows. По умолчанию у него есть графический интерфейс, но это не делает его таким простым в использовании: эти две системы просто запускают процесс в фиксированное время и дату.

Чтобы понять, чем systemd может быть вам полезен, я возьму пример.

Какие подводные камни вам помогут таймеры systemd?

Если у вас когда-либо был компьютер с данными, которые вам небезразличны, вы захотите иметь копию своих данных в другом, возможно, более безопасном месте. Если вы управляете сервером, это обязательно: в конце концов, как вы будете восстанавливаться, если ваш жесткий диск выйдет из строя и не позволит вам восстановить какие-либо данные?

Итак, как ответственный человек вы настраиваете резервное копирование каждую неделю или каждый день. Вы можете настроить его с помощью cron, вы планируете его на 4:24, но здесь начинается проблема: что, если ваш сервер отключен с 4:10 до 4:30 по любой причине?

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

Однако, если пропущенный запуск может быть проблемой, представьте себе одну секунду - вау, Джон Леннон сейчас? - что ваша задача слишком медленная. Если ваша задача настроена на запуск каждые 10 минут, но для ее выполнения требуется 15 минут, cron или Windows с радостью запустят другую задачу, даже если текущая задача еще не завершена - и поэтому у вас будет 2 экземпляра вашей задачи, выполняемых одновременно. , какой идеальный рецепт для катастрофа. Когда программа работает одновременно, хотя она не предназначена для этого, она действительно может повредить файлы, другое программное обеспечение, базы данных - и ваш сервер внезапно становится тонущим кораблем, подобным Титанику.

Хорошо, может я захожу слишком далеко с Титаником, но вы поняли идею. Хотя systemd мало что могла сделать для спасения этого корабля, она может помочь вам со всеми этими недостатками и обеспечить вам более длительные рождественские каникулы благодаря ошибкам, которых она поможет вам избежать. Пришло время узнать, как настроить таймеры systemd.

Как запланировать автоматическое резервное копирование сервера?

Прежде всего, таймеры systemd запускают службу systemd, поэтому, прежде чем планировать задачу, вам нужно сначала сделать ее службой. К счастью, я написал руководство по созданию сервиса systemd, оно познакомит вас с принципом работы systemd. Вы должны прочитать это, прежде чем продолжить. Если только вы точно знаете, что делаете, ваш служебный файл systemd должен нет содержать любой параметр WantedBy =. Если вы хотите запустить свою службу в определенное время, вы, вероятно, не захотите запускать ее при загрузке.

Благодаря системе обслуживания systemd невозможно по ошибке запустить несколько экземпляров вашей задачи: если задача уже запущена, она просто пропустит этот запуск и оставит текущую запущенную задачу завершить свою работу.

Если у вас есть служба systemd для планирования, создайте файл с тем же именем, что и ваша служба, за исключением того, что он должен заканчиваться на .таймер вместо .услуга. В нашем примере с автоматическим резервным копированием сервисом будет автоматизированное резервное копирование.сервис и таймер будут автоматизированы-резервное копирование.таймер. Оба файла должны находиться в одном каталоге. Как я сказал вам в статье службы systemd, я рекомендую вам записать эти файлы в обычном месте, например, в вашем домашнем каталоге, а затем скопировать их в папку systemd, как только вы закончите редактирование.

Итак, позвольте мне показать вам, как выглядит наш файл таймера:

[Ед. изм]
Описание = Запланировать резервное копирование в непиковые часы
[Таймер]
OnCalendar = * - * - * 03:00:00
RandomizedDelaySec = 7200
Постоянный = true
[Установить]
WantedBy = таймеры.цель

Как и в сервисах systemd, есть 3 раздела. [Unit] или [Install] работают точно так же, как описано в моей статье о службах systemd. Обратите внимание, что здесь WantedBy = важен, потому что таймеры можно запускать или останавливать, поэтому, если вы не скажете systemd запустить ваш таймер во время загрузки, он никогда не сработает. таймеры.target - это специальная цель systemd для таймеров.

Теперь раздел [Таймер]. Внутри него вы найдете все настройки, связанные с тем, когда должен срабатывать таймер. Для нашего автоматического резервного копирования я сказал systemd запускать его с 3 до 5 часов утра по часовому поясу сервера. Точное время выбирается случайным образом каждый день.

OnCalendar = устанавливает таймер, связанный со временем вашего сервера (настенные часы), например, каждое воскресенье в 13:00. Если вы ранее использовали cron, вы должны быть хорошо знакомы с этим синтаксисом. Однако у него есть некоторые дополнительные преимущества.

Например, если вы хотите, чтобы что-то происходило ежечасно, вы можете сделать следующее:

OnCalendar = ежечасно

и ежедневно:

OnCalendar = ежедневно

Фактически, он поддерживает все следующие значения:

  1. ежеминутно
  2. ежечасно
  3. ежедневно
  4. ежемесячно
  5. еженедельно
  6. ежегодно
  7. ежеквартальный
  8. раз в полгода

Однако есть проблема с этими ключевыми словами: например, ежедневные триггеры всегда в полночь, что часто является часом пиковой нагрузки в вычислительных системах. Поэтому рекомендуется использовать RandomizedDelaySec = (его использование указано ниже). В любом случае для резервного копирования это не лучший вариант: полночь - это не часы пик, скорее наоборот. Поэтому нам нужно более точно настроить, когда мы хотим, чтобы эта задача была запущена.

Если вы хотите большего контроля, вы можете написать дату, например, 2018-12-06 12:49:37. Что ж, если вы настолько конкретны, вы просто активируете таймер один раз. Чтобы сделать его повторяющимся, вы замените любой из этих элементов на * звездочку.

OnCalendar = * - * - * 03:00:00

Как вы можете видеть выше, в нашем примере с резервной копией вся часть даты имеет вид * - * - *, что означает, что это должно происходить каждый день каждого месяца каждого года. Теперь, если вы это сделаете:

OnCalendar = * - 12-25 03:00:00

Затем он проходит каждые 25 декабря в 3 часа ночи. Идеальный таймер systemd для Деда Мороза - даже если я сомневаюсь, что он когда-нибудь понадобится! Таким образом, звездочка добавляет повторение там, где вы его поместили. Если вы поместите его в поле года, это означает «каждый год» и т. Д.

Наконец, вы можете добавить UTC в конце строки, чтобы использовать время UTC вместо местного часового пояса. Например, некоторые службы сбрасывают квоты API в полночь, но во избежание смещения часового пояса используют UTC. Итак, для таких задач вам нужно:

OnCalendar = ежедневно по всемирному координированному времени

А теперь давайте решим еще одну проблему: часы пик. systemd также имеет настройку для борьбы с этим.

RandomizedDelaySec = позволяет отложить задачу на случайное количество времени. Значение - это максимальное количество секунд, на которое таймер будет задерживать. Он специально предназначен для таких случаев. Вы помните, что в systemd daily всегда срабатывает в полночь? Что ж, еженедельный запуск всегда срабатывает в полночь понедельника, а годовой запускается в полночь 1 января, один из худших пиков в году с отключениями сети повсюду. Вы, конечно, не хотите, чтобы это произошло.

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

Скажем, вам нужно запустить свои задачи около 7 часов утра, но вы хотите сделать небольшую задержку максимум на 15 минут, вы бы сделали следующее:

RandomizedDelaySec = 900

Этого должно хватить на задержки. Иногда задержки даже в миллисекунды достаточно, чтобы предотвратить непреднамеренные всплески.

Постоянный = заботится о пропущенных триггерах таймера. Что делать, если ваш сервер выключен ночью? Ну, бэкап вообще не сработает. Установка значения true позволяет systemd запускать его при следующей загрузке в таких случаях. Таким образом, вы так или иначе узнаете, что задача таймера будет запущена. Его использование простое, вы просто делаете это:

Постоянный = true

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

OnBootSec = - последний вариант, который я вам покажу (но не в последнюю очередь). Это если вы хотите запустить таймер через некоторое время после загрузки, а не на основе календаря. Например, если вам нужно проверить при запуске, правильно ли запущен ваш сервер и работает ли он должным образом, вы можете написать службу проверки и использовать эту настройку таймера для ее запуска после того, как у системы будет достаточно времени для загрузки.

Допустим, системе требуется 3 минуты для загрузки, вы можете:

OnBootSec = 180

И, несмотря на название, вы также можете:

OnBootSec = 3 минуты

Если вы укажете как OnBootSec =, так и OnCalendar =, он запустит службу всякий раз, когда произойдет любое из этих двух событий.

Хорошо, теперь пришло время сохранить ваш файл, скопировать его в системную папку, если вы следовали моему совету выше, и проверить, правильно ли работает ваш таймер.

Включите свой новый таймер и мониторинг

Чтобы проверить свой новый таймер, вы должны сообщить systemd, что вы добавили новый таймер, поэтому вам нужно ввести эту команду:

$ sudo systemctl демон-перезагрузка

Теперь systemd будет учитывать ваш новый таймер и внимательно следить за тем, когда запускать вашу задачу. Поскольку systemd всегда работает, это, в конце концов, один из лучших кандидатов для управления и выполнения ваших запланированных задач.

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

$ sudo systemctl enable --now автоматическое резервное копирование.таймер

Затем вы, вероятно, захотите увидеть, работает ли ваш таймер так, как ожидалось. Хорошие новости: systemd даже достаточно любезен, чтобы иметь команду, сообщающую вам, когда он был запущен в последний раз и когда запланирован следующий запуск (кроме случаев, когда таймер настроен на запуск только при загрузке, поскольку systemd, очевидно, не знает, когда система снова загрузится). Вот эта команда:

$ systemctl status автоматическое резервное копирование.таймер

Наконец, когда вам больше не нужен таймер, вы также можете отключить его:

$ sudo systemctl disable --now автоматическое резервное копирование.таймер

Заключение

Используя таймеры systemd, ваше управление запланированными задачами выходит на новый уровень: честно говоря, я лично считаю, что запланированные задачи должны были быть такими уже много лет.

О, один маленький сюрприз для вас: все таймеры systemd зарегистрированы в хорошо структурированной системе с фильтрацией, ротацией журналов и всем подобным. Итак, я приглашаю вас посмотреть, как вы можете просматривать журналы о ваших запланированных задачах!

Обзор беспроводной мыши Microsoft Sculpt Touch
Я недавно прочитал о Microsoft Sculpt Touch беспроводная мышь и решил ее купить. Побывав некоторое время, я решил поделиться своим опытом с ним. Эта б...
Экранный трекпад и указатель мыши AppyMouse для планшетов с Windows
Пользователи планшетов часто пропускают указатель мыши, особенно когда они привыкли пользоваться ноутбуками. Смартфоны и планшеты с сенсорным экраном ...
Средняя кнопка мыши не работает в Windows 10
В средняя кнопка мыши помогает пролистывать длинные веб-страницы и экраны с большим объемом данных. Если это прекратится, вы в конечном итоге будете и...