
У меня есть два скрипта оболочки с именами first.sh и second.sh. Содержимое first.sh и second.sh приведено ниже:
>>first.sh
#!/bin/bash
while true
do
echo The current time is $(date)
sleep(1)
done
>>second.sh
#!/bin/bash
while true
do
echo The current time from second script is $(date)
sleep(1)
done
Аналогично, содержимое first.service следующее:
[Unit]
Description=first service
After=second.service
[Service]
ExecStart=/home/abanstola/first.sh
Содержание second.service:
[Unit]
Description=Second service
[Service]
ExecStart=/home/abanstola/second.sh
Обратите внимание After=second.service
на в коде first.service. Согласно документации, первая служба не должна запускаться, пока не запустится вторая. Но даже если я отключу или остановлю вторую службу, первая служба запустится без проблем. Что я делаю не так?
решение1
Вы неправильно прочитали документацию.Цитировать:
Если блок
foo.service
содержит настройкуBefore=bar.service
и оба блока запускаются,bar.service
запуск откладывается до тех пор, покаfoo.service
не завершится запуск.After=
является обратным по отношению к Before=
Выделено мной. Это имеет эффект только если оба блока запущены. Если вы отключите один из них, это не имеет никакого эффекта.
Не совсем понятно, чего вы на самом деле хотите.
Вероятно, лучшим выбором будет:
Аналогично
Wants=
, но объявляет более сильную зависимость требований. Зависимости этого типа также можно настроить, добавив символическую ссылку на.requires/
каталог, сопровождающий файл модуля.Если этот блок активируется, перечисленные блоки также будут активированы. Если один из других блоков не активируется, и
After=
установлена зависимость упорядочивания от отказавшего блока, этот блок не будет запущен. Кроме того, с указанием или без указанияAfter=
этот блок будет остановлен, если один из других блоков явно остановлен.
Настраивает зависимости, аналогичные
Requires=
, но ограниченные остановкой и перезапуском юнитов. Когда systemd останавливает или перезапускает перечисленные здесь юниты, действие распространяется на этот юнит. Обратите внимание, что это односторонняя зависимость — изменения в этом юните не влияют на перечисленные юниты.