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» там.

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

  • Удаление таймера, созданного с помощью systed-run --on-calendar
  • Cron vs systemd таймеры
  • Поручить выполнить блок после успешного завершения работы другого устройства
  • Синхронизировать почту с помощью offlineimap через службу / таймер systemd; получение пароля из гнома
  • «Systemctl list-timers» показывает последние выполненные даты, которые далеки в будущем
  • Есть ли способ узнать, когда будет запускаться системный таймер?
  • Linux и Unix - лучшая ОС в мире.