Как использовать таймеры Systemd в качестве замены Cron

Как пользователь Linux, вы, вероятно, знакомы с cron. Он работал в качестве основного планировщика заданий в Unix на основе времени в течение многих лет. Теперь многие пользователи используют таймеры Systemd, чтобы заменить доминирование cron. В этой статье мы рассмотрим основы настройки собственного таймера Systemd и убедимся, что он работает правильно в вашей системе.

Почему стоит использовать таймеры Systemd, а не Cron?

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

Еще одно преимущество таймеров Systemd перед Cron заключается в том, что они предоставляют более детальный контроль над тем, как запускать запланированные задания. Например, в Systemd Timers есть переменная OnBootSec, которая позволяет отложить выполнение сервисного блока до истечения определенного времени после успешной загрузки.

Наконец, таймеры Systemd также невероятно точны по сравнению с обычным демоном cron. По умолчанию он может отслеживать и выполнять задания с точностью до микросекунды с помощью переменной AccuracySec. Это невероятно полезно, если вы работаете на компьютере, где требуется точное время выполнения запланированных задач.

Установка таймеров Systemd

Таймеры являются встроенной функцией Systemd. Это означает, что если вы используете Systemd в качестве демона init, как это происходит в популярных дистрибутивах Linux, таких как Arch, Fedora и Ubuntu, ваша машина уже использует эту функцию в некоторых системных процессах.

Чтобы проверить, работает ли в вашем дистрибутиве Systemd, вы можете выполнить следующую команду:

systemctl

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

Список существующих таймеров

Проще всего проверить, запущен ли таймер под вашей учетной записью пользователя, с помощью следующей команды:

systemctl list-timers

Вы также можете использовать флаг --all для проверки всех таймеров в системе, включая неактивные:

systemctl list-timers --all

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

Создание новой службы и таймера

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

Начните с создания пустых файлов «.service» и «.timer» в вашем домашнем каталоге:

touch ~/my-new-timer.{service,timer}

Откройте новый служебный файл с помощью вашего любимого текстового редактора:

nano ~/my-new-timer.service

Вставьте следующий шаблон в новый служебный файл:

[Unit]
Name=My New Service
Description=The unit file for my custom command. 
[Service]
Type=oneshot
User=ramces 
WorkingDirectory=/home/ramces/
ExecStart=/home/ramces/.local/bin/my-script.sh
[Install]
WantedBy=multi-user.target

Сохраните файл «.service», затем откройте пустой файл «.timer» с помощью того же текстового редактора:

nano ~/my-new-timer.timer

Вставьте следующий блок кода в файл timer:

[Unit]
Name=My New Service
Description=The timer for my custom command. 
[Timer]
Unit=my-new-timer.service
OnCalendar=*-*-* 11:43:00
Persistent=true 
[Install]
WantedBy=timers.target

Перейдите к разделу [Timer], затем замените значение переменной OnCalendar на дату и время, в которые вы хотите, чтобы запускался ваш блок Systemd. В моем случае я хочу, чтобы моя программа запускалась ровно в 11:43 утра каждый день.

Примечание: Три звездочки перед значением «11:43:00» означают год, месяц и день. Например, установив это значение в «09-15-24», Systemd запустит вашу службу только один раз 15 сентября 2024 года.

Создание монотонного таймера

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

Чтобы начать, откройте файл «.timer» и прокрутите его вниз до раздела [Timer].

Удалите переменные OnCalendar и Persistent, затем добавьте OnBootSec, за которым следует временной интервал, когда вы хотите запустить ваш файл блока. Например, если задать значение «1hr», Systemd запустит вашу команду через час после успешной загрузки компьютера.

Добавьте переменную OnUnitActiveSec чуть ниже OnBootSec, затем укажите интервал, через который вы хотите, чтобы таймер непрерывно запускался после загрузки системы. В моем случае я задам значение «30min», поскольку я хочу, чтобы моя задача запускалась каждые 30 минут после ее первоначального запуска.

Создание переходного таймера

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

Чтобы создать простой временный таймер, вставьте следующую строку кода в терминальную сессию, а затем замените значение переменной --on-calendar на интервал, через который вы хотите, чтобы выполнялась ваша команда:

sudo systemd-run --on-calendar="*-*-* 11:46:00"

Добавьте команду, которую вы хотите запустить, в конец строки, а затем нажмите Enter, чтобы запланировать ее.

sudo systemd-run --on-calendar="*-*-* 11:46:00" /home/ramces/.local/my-script.sh

Вы также можете создавать временные монотонные таймеры, используя переменные --on-boot и --on-unit-active:

sudo systemd-run --on-boot="1hr" --on-unit-active="30m" /home/ramces/.local/my-script.sh

Убедитесь, что ваш временный таймер теперь стоит в очереди в планировщике заданий Systemd, выполнив следующую команду:

sudo systemctl status run*.timer

Примечание: Systemd-run – это не просто способ создания временных таймеров в Linux. Узнайте, как использовать его в качестве альтернативы sudo с помощью Run0.

Запуск таймера Systemd

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

sudo cp /home/ramces/my-new-timer.{service,timer} /etc/systemd/system/

Перезагрузите текущую конфигурацию демона init:

sudo systemctl daemon-reload

Активируйте службу и таймер, которые вы создали с помощью systemctl:

sudo systemctl enable my-new-timer.service
sudo systemctl enable --now my-new-timer.timer

Проверьте, правильно ли вы загрузили новый таймер, запустив sudo systemctl status my-new-timer.timer в новой терминальной сессии. В данном случае вы видите, что мой таймер теперь запланирован и готов к запуску в системе.

Обучение планированию задач с помощью таймеров Systemd – это лишь одна часть понимания того, как работает ваша машина Linux под капотом. Погрузитесь глубже во внутреннее устройство этой замечательной ОС, посмотрев нашу сравнительную статью о Grub и Systemd-boot.

Зарубин Иван Эксперт по Linux и Windows

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

Вдохновлен www.maketecheasier.com

Похожие статьи

Комментарии (0)