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

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

  • использование таймеров systemd вместо cron
  • systemd.unit `RequiresMountsFor =` vs `ConditionPathIsDirectory =`
  • systemd запустить блок на успех другого
  • Предотвращение запуска таймера systemd при запуске
  • Как настроить Systemd Timer для запуска службы в последний день месяца
  • systemd: изящно сбой резервного копирования, когда внешний диск не подключен
  • Interesting Posts

    Dovecot POP3S & IMAPS SSL-сертификат, который работает для всех доменов пользователей

    Проблемы с GPG при выпуске с Leiningen

    Не удается войти после редактирования /etc/security/limits.conf

    Ошибка при установке общей папки для гостевой системы KVM Solaris

    XMonad MouseResizableTile автоматическое перебалансирование панели

    высокая производительность процессора при выполнении скриптов на rhel 7 VM, исходящих из rngd

    SCP через несколько хостов

    Arch Linux, Openbox и Desktop

    Использование winexe для запуска команд «wmic» на машине Windows

    Данные, добавляемые к файлу, и когда его значение пересекло 200 МБ, новый файл должен быть создан

    Блокировать доступ к файлу или местоположению на Nginx

    Драйверы устройств Linux – функция зонда не вызывается, но драйвер откладывается

    В чем смысл IFS = $ '\ n' в сценариях bash?

    Как настроить LinuxMint 17 для вызова команд с помощью мыши?

    Игнорировать все, кроме текста, при сравнении файлов с diff?

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