Linux32 - Блог



LINUX32

Свобода выбирать


ArchLinux
Блог >> 2016 >> Апрель


30.04.2016

Systemd timer вместо cron'a




Добрый день.

Сегодня решил написать продолжение своей статьи об анакроне. Речь опять пойдет о запуске задач по расписанию, но уже с помощью другого инструмента, а именно - systemd. Так как этот универсальный солдат присутствует по умолчанию в системе (в первую очередь речь идет об archlinux) и предоставляет нужный функционал.

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

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

Монотонные таймеры позволяют запускать сервис при загрузке системы (что-то вроде автозапуска). Из опций монотонных таймеров коснусь только этой:

[Timer]
OnBootSec=


Она позволяет задавать задержку запуска сервиса после старта системы. Чаще всего используется для равномерного распределения стартующих одновременно приложений.

В таймерах реального времени больше интересных опций. Например эта:

OnCalendar=mon-fri 9/2:20


Задает время выполнения сервиса. В данном случае сервис будет выполняться каждый день кроме выходных начиная с девяти двадцати утра и далее через каждые два часа.

Persistent=true


Эта опция задает поведение системд таймера подобно анакрону. То есть если в момент выполнения таймера компьютер был выключен, то таймер запустится сразу после следующего старта системы, а далее по расписанию, заданному в секции [Timer].

Еще одна опция, которую опишу:

RandomizedDelaySec=30min


Она задает случайное время в диапазоне от 0 до определенного в этой строке (в данном примере 30 минут) которое таймер будет ждать перед выполнением сервиса.

В сумме получается например такой systemd backup.timer:

[Unit]
Description=Запуск backup-скрипта

[Timer]
OnCalendar=mon-fri 9/3:20
RandomizedDelaySec=15min
Persistent=true

[Install]
WantedBy=timers.target


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

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

Уверен что есть более элегантное решение. Буду благодарен, если поделитесь с ним в комментариях.

Статья


Ваш комментарий:

Имя:
E-mail:
Код с картинки:
Комментарий: