Если вы создадите До=
и После=
в вашей Услуга
файл, вы получите сообщение об ошибке:
A.service: задание B.service/start удалено, чтобы прервать цикл заказа, начиная с A.service/start
Потому что Systemd не хочет иметь обе эти зависимости на одном устройстве. Я не думаю, что кто-либо из Состояние...=
от человек systemd.unit
которые упомянул Майкл, хорошо подходят для задачи, которую вы пытаетесь выполнить, если только ваши команды не создают, а затем очищают свои собственные файлы. Как я это вижу, у вас есть два основных возможных решения:
- Создать
ExecCondition=
в вашей Услуга
который запускает команду, чтобы проверить, если Б.сервис
это работает.Это немного сложно сделать, используя только ps и grep из вашего файла модуля, поэтому вы, вероятно, захотите выполнить какой-то внешний скрипт, но вы уже сказали, что хотите избежать грязного файла блокировки, так что это, вероятно, не идеально.
- Используйте грязное решение для файла блокировки, о котором вы упомянули, что вы не хотите использовать
- Переместите вторую команду из
Б.сервис
и в ExecStopPost=
вариант в Услуга
. Это приведет к запуску второй команды только после остановки первой команды. Это также предотвратит появление нового Услуга
от запуска до того, как первый полностью завершится. Я считаю, что это выполняет все ваши желания, так как Услуга
команда и Б.сервис
команда никогда не будет выполняться одновременно, две Услуга
команды никогда не будут выполняться параллельно друг другу, а новые выполнения будут просто поставлены в очередь.
Вот файл модуля, который я использовал для тестирования варианта 3:
[Ед. изм]
Описание = A.service для сбоя сервера
[Оказание услуг]
Тип = ваншот
# A.сервисная команда
ExecStart = /usr/bin/сон 3
# Б.сервисная команда
ExecStopPost = /usr/bin/сон 30
А затем протестировано с использованием systemctl запустить A.service
многократно в нескольких окнах терминала, отслеживая ход выполнения тех процессов, которые фактически выполнялись в любой момент с помощью PS
.