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 

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

  • Поручить выполнить блок после успешного завершения работы другого устройства
  • systemd: изящно сбой резервного копирования, когда внешний диск не подключен
  • Как узнать, какая команда выполняется файлом systemd .timer?
  • Каков правильный способ отключения блока таймера systemd?
  • Запуск пользовательского таймера systemd, когда у них нет открытого сеанса
  • systemd.unit `RequiresMountsFor =` vs `ConditionPathIsDirectory =`
  • использование таймеров systemd вместо cron
  • Как настроить Systemd Timer для запуска службы в последний день месяца
  • One Solution collect form web for “systemd: Как выполнять задание как периодически, так и один раз при завершении работы системы?”

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

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

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

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

    Interesting Posts

    стоп трубы () открытие stdin

    Сделать работу hunspell с emacs и немецким языком

    Предотвращение наручных цветов

    найти совпадающие файлы в одном каталоге и подкаталогах

    Снимок экрана с неактивным окном

    Использование `kill -s 0 $ pid` vs` ] `, чтобы определить, работает ли PID

    EUI64 и ipv6: как использовать собственный EUI64 для автоконфигурации IPv6

    TeamSpeak отключает другие приложения

    Простая передача файлов

    не может понять обратную косую черту в двойных кавычках bash

    Отключить перезагрузку / выключение / приостановить / etc из графического интерфейса

    Параметры приостановки с помощью KDM greeter

    sendmail: что вызывает «Отложенный недопустимый аргумент» и как его исправить?

    Можно ли найти диапазон физических адресов модуля DIMM?

    Есть ли недостатки / последствия для добавления запланированных задач непосредственно в / etc / crontab вместо использования команды crontab?

    Linux и Unix - лучшая ОС в мире.