systemd: Как выполнять задание как периодически, так и один раз при завершении работы системы?

Я хочу периодически запускать задание (например, каждые 5 минут) и, наконец, один раз при остановке системы.

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

 [Service] Type=oneshot RemainAfterExit=true ExecStart=/bin/true ExecStop=<some command to run at system shutdown> 

Но я стараюсь сочетать оба подхода. Единственный вариант, о котором я могу думать, – написать два независимых сервиса:

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

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

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

Вопрос:

  • Каков наилучший способ запуска задания как периодически, так и один раз при выключении системы?
  • Можно ли избежать использования двух (в основном дублированных) служебных файлов?

Чтобы получить впечатление, что я имею в виду с дублированием кода, это некоторые параметры безопасности, которые я использую при выполнении задания:

 User=foo ProtectSystem=strict ProtectHome=yes PrivateTmp=yes ProtectKernelTunables=yes ProtectKernelModules=yes ProtectControlGroups=yes NoNewPrivileges=yes PrivateDevices=yes PrivateUsers=yes CapabilityBoundingSet= AmbientCapabilities= SystemCallFilter=~@clock @module @mount @obsolete @raw-io ptrace ReadOnlyPaths=-/some/path 

В моем набросанном подходе мне нужно будет дублировать этот код (по одной копии для каждой службы).

One Solution collect form web for “systemd: Как выполнять задание как периодически, так и один раз при завершении работы системы?”

Вы можете решить дубликат, создав два каталога: foo-at-shutdown.service.d и 'foo-period.service.d`.

В одной папке создайте файл с именем foo-shared.conf .
Используйте символическую ссылку, чтобы добавить ее во вторую папку.

Это «выпадающие» единицы, которые будут втянуты в основные файлы конфигурации. Они документируются больше в man systemd.unit если вы ищете «drop-in» там.

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

  • Cron vs systemd таймеры
  • использование таймеров systemd вместо cron
  • systemd: изящно сбой резервного копирования, когда внешний диск не подключен
  • системный таймер каждые 2 часа через 30 минут после часа?
  • «Systemctl list-timers» показывает последние выполненные даты, которые далеки в будущем
  • Как узнать, какая команда выполняется файлом systemd .timer?
  • systemd запустить блок на успех другого
  • Поручить выполнить блок после успешного завершения работы другого устройства
  • Предотвращение запуска таймера systemd при запуске
  • Linux и Unix - лучшая ОС в мире.