Как и задания cron, таймеры systemd могут запускать события - сценарии и программы оболочки - через определенные интервалы времени, например, один раз в день, в определенный день месяца (например, только в понедельник или вторник) или каждые 15 минут в рабочее время с 8:00 до 18:00. Таймеры также могут делать некоторые вещи, которые сложно реализовать с помощью "классического" cron. Например, таймер может запускать сценарий или программу для определенного промежутка времени после события, такого как загрузка, запуск или завершение предыдущей задачи.
Когда Fedora или любой другой дистрибутив на основе systemd устанавливается в новой системе, он создает несколько таймеров, которые являются частью процедур обслуживания системы. Эти задачи происходят в фоновом режиме на любом хосте Linux. Такие таймеры запускают события, необходимые для общих задач обслуживания, таких как обновление системных баз данных, очистка временных каталогов, ротация файлов журналов и так далее.
В качестве примера можно взглянуть на некоторые таймеры на моей основной рабочей станции, используя команду systemctl status * timer, чтобы вывести список всех таймеров на моем хосте. Символ звездочки работает так же, как и для подстановки файлов, поэтому эта команда перечисляет все блоки таймера systemd:
Хотя мы можем разобрать один или несколько существующих таймеров, чтобы узнать, как они работают, давайте создадим собственный сервисный блок и таймер для его запуска. Мы будем использовать довольно тривиальный пример, чтобы не усложнять задачу. После того, как мы закончим с этим, будет легче понять, как работают другие таймеры, и определить, что они делают.
Во-первых, создадим простую службу, которая будет запускать что-то базовое, например какую то команду. Может возникнуть необходимость периодически отслеживать свободное дисковове пространство. Создайте следующий файл модуля myMonTest.service в каталоге /etc/systemd/system. Файл может быть неисполняемым:
# Этот системный юнит создан для тестирования таймера
[Unit]
Description=Capturing system stats to the logfile
Wants=myMonTest.timer
[Service]
Type=oneshot
ExecStart=/bin/df
[Install]
WantedBy=multi-user.target
Теперь давайте посмотрим на вывод команды status что бы отследить как был создан вышеописанный таймер.
# systemctl status myMonTest.service
● myMonTest.service - Capturing system stats to the logfile
Loaded: loaded (/etc/systemd/system/myMonTest.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Далее, не забываем активировать созданный таймер:
# systemctl enable myMonTest.service
Created symlink /etc/systemd/system/multi-user.target.wants/myMonTest.service → /etc/systemd/system/myMonTest.service.
Далее, прсмотрим список таймеров (мы должны увидеть и наш таймер):
# systemctl list-timers --all
NEXT LEFT LAST PASSED UNIT ACTIVATES
Mon 2020-10-05 17:09:00 PDT 10min left Mon 2020-10-05 16:39:05 PDT 19min ago phpsessionclean.timer phpsessionclean.service
Tue 2020-10-06 01:03:54 PDT 8h left Mon 2020-10-05 13:52:04 PDT 3h 6min ago motd-news.timer motd-news.service
Tue 2020-10-06 01:45:00 PDT 8h left Mon 2020-10-05 15:03:03 PDT 1h 55min ago snap.certbot.renew.timer snap.certbot.renew.service
Tue 2020-10-06 05:51:12 PDT 12h left Mon 2020-10-05 16:45:45 PDT 12min ago apt-daily.timer apt-daily.service
Tue 2020-10-06 06:07:23 PDT 13h left Mon 2020-10-05 06:56:22 PDT 10h ago apt-daily-upgrade.timer apt-daily-upgrade.service
Tue 2020-10-06 16:37:45 PDT 23h left Mon 2020-10-05 16:37:45 PDT 20min ago systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
Mon 2020-10-12 00:00:00 PDT 6 days left Mon 2020-10-05 00:00:03 PDT 16h ago fstrim.timer fstrim.service
n/a n/a n/a n/a myMonTest.timer
n/a n/a n/a n/a snapd.snap-repair.timer snapd.snap-repair.service
Как видно из вывода выше, наш таймер второй снизу в списке.
Далее, создадим /etc/systemd/system/myMonTest.timer:
[Unit]
Description=Logs some system stats
Requires=myMonTest.service
[Timer]
Unit=myMonTest.service
OnCalendar=*-*-* *:*:00
[Install]
WantedBy=timers.target
Указание времени OnCalendar в файле myMonitor.timer, * - * - * *: *: 00, должно запускать таймер для выполнения модуля myMonitor.service каждую минуту.
Если мы сейчас просмотрим список таймеров, то увидим:
# systemctl list-timers --all
NEXT LEFT LAST PASSED UNIT ACTIVATES
Mon 2020-10-05 17:21:00 PDT 25s left Mon 2020-10-05 17:20:03 PDT 30s ago myMonTest.timer myMonTest.service
Что бы принудительно запустить таймер, выполните:
# journalctl -S today -f -u myMonTest.service
Вывод будет похож на нечто такое:
# journalctl -S today -u myMonTest.service
-- Logs begin at Fri 2020-03-06 20:27:14 PST, end at Mon 2020-10-05 17:18:03 PDT. --
Oct 05 16:54:04 instance-5 systemd[1]: Starting Capturing system stats to the logfile...
Oct 05 16:54:04 instance-5 df[28813]: Filesystem 1K-blocks Used Available Use% Mounted on
Oct 05 16:54:04 instance-5 df[28813]: /dev/root 20145724 7012016 13117324 35% /
Oct 05 16:54:04 instance-5 df[28813]: devtmpfs 1887716 0 1887716 0% /dev
Oct 05 16:54:04 instance-5 df[28813]: tmpfs 1890904 0 1890904 0% /dev/shm
Oct 05 16:54:04 instance-5 df[28813]: tmpfs 1890904 964 1889940 1% /run
Oct 05 16:54:04 instance-5 df[28813]: tmpfs 5120 0 5120 0% /run/lock
Oct 05 16:54:04 instance-5 df[28813]: tmpfs 1890904 0 1890904 0% /sys/fs/cgroup
Oct 05 16:54:04 instance-5 df[28813]: /dev/sda15 106858 3433 103426 4% /boot/efi
Oct 05 16:54:04 instance-5 df[28813]: tmpfs 378180 0 378180 0% /run/user/1
Посольку наш таймер был создан для теста, отключим его что бы не засорять систему:
root@instance-5:/etc/systemd/system# systemctl stop myMonTest.service
root@instance-5:/etc/systemd/system# systemctl disable myMonTest.service