Рейтинг:1

Можно ли использовать обе опции «After=» и «Before=» для одного и того же устройства (службы) вместе в службе systemd?

флаг in

Тип = ваншот Ед. изм Услуга запускается ежечасно А.таймер и это Хочет=B.service, но работает До=B.service. Ед. изм Б.сервис это также Тип = ваншот. Требование здесь состоит в том, что их процессы никогда не должны перекрываться во время выполнения (один выстрел гарантирует именно это), все отлично до сих пор. Теперь представьте себе ситуацию, когда оба А и Б вместе бегают более часа (время между А.таймер пожары). Здесь есть две возможности:

  1. А работает больше часа, то хотя А.таймер хочет выстрелить, и, вероятно, это произойдет, несмотря на то, что еще один экземпляр А не будет запущен до тех пор, пока не завершится первый, поскольку уникальность экземпляра службы является одним из фундаментальных принципов в системад. Я считаю, что это будет просто очередь. Опять же, пока все отлично, у нас нет риска перекрытия процессов во время выполнения.
  2. А работает достаточно долго, так что Б, который запускается позже, также выполняется достаточно долго, чтобы в общей сложности превысить один час, и в результате А.таймер пожары, чтобы начать новый А пока Б все еще работает. Вот где мы сталкиваемся с перекрытием процессов, потому что нет После=B.service в Услуга как уже есть До=B.service.

Мой вопрос, в основном, в том, допустимо ли даже иметь оба После=B.service и До=B.service в Услуга в первую очередь? И, конечно же, решит ли это проблему дублирования, описанную во второй возможности, как я теоретически ожидаю? Есть ли другие системад-способ решения этой проблемы (например, я не хочу связываться с подверженным ошибкам раздуванием файла блокировки)?

Michael Hampton avatar
флаг cz
Вы, вероятно, должны вместо этого установить какое-то `Condition...=`.
Рейтинг:2
флаг br

Если вы создадите До= и После= в вашей Услуга файл, вы получите сообщение об ошибке:

A.service: задание B.service/start удалено, чтобы прервать цикл заказа, начиная с A.service/start

Потому что Systemd не хочет иметь обе эти зависимости на одном устройстве. Я не думаю, что кто-либо из Состояние...= от человек systemd.unit которые упомянул Майкл, хорошо подходят для задачи, которую вы пытаетесь выполнить, если только ваши команды не создают, а затем очищают свои собственные файлы. Как я это вижу, у вас есть два основных возможных решения:

  1. Создать ExecCondition= в вашей Услуга который запускает команду, чтобы проверить, если Б.сервис это работает.Это немного сложно сделать, используя только ps и grep из вашего файла модуля, поэтому вы, вероятно, захотите выполнить какой-то внешний скрипт, но вы уже сказали, что хотите избежать грязного файла блокировки, так что это, вероятно, не идеально.
  2. Используйте грязное решение для файла блокировки, о котором вы упомянули, что вы не хотите использовать
  3. Переместите вторую команду из Б.сервис и в ExecStopPost= вариант в Услуга. Это приведет к запуску второй команды только после остановки первой команды. Это также предотвратит появление нового Услуга от запуска до того, как первый полностью завершится. Я считаю, что это выполняет все ваши желания, так как Услуга команда и Б.сервис команда никогда не будет выполняться одновременно, две Услуга команды никогда не будут выполняться параллельно друг другу, а новые выполнения будут просто поставлены в очередь.

Вот файл модуля, который я использовал для тестирования варианта 3:

[Ед. изм]
Описание = A.service для сбоя сервера
[Оказание услуг]
Тип = ваншот
# A.сервисная команда
ExecStart = /usr/bin/сон 3 
# Б.сервисная команда
ExecStopPost = /usr/bin/сон 30

А затем протестировано с использованием systemctl запустить A.service многократно в нескольких окнах терминала, отслеживая ход выполнения тех процессов, которые фактически выполнялись в любой момент с помощью PS.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.