Если вы создадите До= и После= в вашей Услуга файл, вы получите сообщение об ошибке:
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.