Intereting Posts
Можно ли получить индекс сетевого интерфейса не через / sys? обработка ошибок runuser Как найти файл с именем, которое зависит от текущей даты (и случайного компонента)? Что происходит, когда вы удаляете жесткую ссылку? Vim gg = G (полный файл цели) без потери текущей позиции Есть ли определенный способ связать исходный код драйвера в ядре Linux с самим устройством? Какую команду в monitrc можно использовать для запуска / остановки служб systemd? палец и кто использует команду Как удалить ошибку «split lines» в Bluefish? Могу ли я отслеживать тире скрипта без изменения его исходного кода? Необходимость ssh с одного сервера Amazon EC2 в другой Есть ли другой способ использовать tail -f для работы grep -q &&? Ошибка Preseed с выходом 2 pthread в реальном времени, созданный из потока, отличного от реального времени, с помощью init.d Убедитесь, что на экране есть звонок / предупреждение со всей строкой состояния

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 

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

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

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

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

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