Показать статистику
0 голосов
от (4.5тыс. баллов)
редактировать от
Всем привет. Собираюсь перейти на использование таймеров systemd вместо привычных cron-задач. Хотелось бы получить совет и так же изучить чужой опыт. Сталкивались ли вы с какими то сложностями, "подводными камнями" при переходе на systemd timers?
895 просмотров 1 ответов

1 Ответ

0 голосов
от (17.4тыс. баллов)
редактировать от

Как и задания cron, таймеры systemd могут запускать события - сценарии и программы оболочки - через определенные интервалы времени, например, один раз в день, в определенный день месяца (например, только в понедельник или вторник) или каждые 15 минут в рабочее время с 8:00 до 18:00. Таймеры также могут делать некоторые вещи, которые сложно реализовать с помощью "классического" cron. Например, таймер может запускать сценарий или программу для определенного промежутка времени после события, такого как загрузка, запуск или завершение предыдущей задачи.

Системные таймеры

Когда Fedora или любой другой дистрибутив на основе systemd устанавливается в новой системе, он создает несколько таймеров, которые являются частью процедур обслуживания системы. Эти задачи происходят в фоновом режиме на любом хосте Linux. Такие таймеры запускают события, необходимые для общих задач обслуживания, таких как обновление системных баз данных, очистка временных каталогов, ротация файлов журналов и так далее.

В качестве примера можно взглянуть на некоторые таймеры на моей основной рабочей станции, используя команду systemctl status * timer, чтобы вывести список всех таймеров на моем хосте. Символ звездочки работает так же, как и для подстановки файлов, поэтому эта команда перечисляет все блоки таймера systemd: 

root@instance-5:/var/www/unixhow# systemctl list-timers
NEXT                         LEFT           LAST                         PASSED       UNIT                         ACTIVATES
Sat 2020-10-03 14:09:00 PDT  22min left     Sat 2020-10-03 13:39:00 PDT  7min ago     phpsessionclean.timer        phpsessionclean.service
Sat 2020-10-03 14:49:51 PDT  1h 3min left   Sat 2020-10-03 06:33:45 PDT  7h ago       motd-news.timer              motd-news.service
Sat 2020-10-03 15:03:00 PDT  1h 16min left  n/a                          n/a          snap.certbot.renew.timer     snap.certbot.renew.service
Sat 2020-10-03 16:37:35 PDT  2h 51min left  Fri 2020-10-02 16:37:35 PDT  21h ago      systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
Sun 2020-10-04 05:57:20 PDT  16h left       Sat 2020-10-03 11:28:52 PDT  2h 17min ago apt-daily.timer              apt-daily.service
Sun 2020-10-04 06:07:46 PDT  16h left       Sat 2020-10-03 06:24:02 PDT  7h ago       apt-daily-upgrade.timer      apt-daily-upgrade.service
Mon 2020-10-05 00:00:00 PDT  1 day 10h left Mon 2020-09-28 00:00:02 PDT  5 days ago   fstrim.timer                 fstrim.service

7 timers listed.
Pass --all to see loaded but inactive timers, too.
root@instance-5:/var/www/unixhow# systemctl list-timers
NEXT                         LEFT        LAST                         PASSED       UNIT                         ACTIVATES
Mon 2020-10-05 16:37:45 PDT  26min left  Sun 2020-10-04 16:37:45 PDT  23h ago      systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
Mon 2020-10-05 16:39:00 PDT  27min left  Mon 2020-10-05 16:09:05 PDT  2min 14s ago phpsessionclean.timer        phpsessionclean.service
Mon 2020-10-05 16:45:42 PDT  34min left  Sun 2020-10-04 23:00:58 PDT  17h ago      apt-daily.timer              apt-daily.service
Tue 2020-10-06 01:45:00 PDT  9h left     Mon 2020-10-05 15:03:03 PDT  1h 8min ago  snap.certbot.renew.timer     snap.certbot.renew.service
Tue 2020-10-06 05:05:02 PDT  12h left    Mon 2020-10-05 13:52:04 PDT  2h 19min ago motd-news.timer              motd-news.service
Tue 2020-10-06 06:17:12 PDT  14h left    Mon 2020-10-05 06:56:22 PDT  9h ago       apt-daily-upgrade.timer      apt-daily-upgrade.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

7 timers listed.

Как создать таймер

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

Во-первых, создадим простую службу, которая будет запускать что-то базовое, например какую то команду. Может возникнуть необходимость периодически отслеживать свободное дисковове пространство. Создайте следующий файл модуля 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

 

...