LINUX.ORG.RU
решено ФорумAdmin

systemd: зависимости

 


2

5

Всех приветствую.

Возникла нужда настроить зависимости пары юнитов.

unit1:

[Unit]
Description=unit1
TimeoutSec=20
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target

unit2:

[Unit]
Description=unit2
Requires=unit1
After=unit1
TimeoutSec=20
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target

Тоже самое словами (по крайней мере то, что я хочу получить).

unit1 стартует сам по себе и ни от кого не зависит.

unit2 стартует только после uni1, и работает только если работает unit1. Иногда unit1 может останавливаться или рестартовать. И мне нужно, чтобы unit2 при останове первого тоже останавливался, но при старте первого так же поднимался. Пока что, с такими настройками, первоначальный старт нормальный, а вот запуск второго после рестарта первого не происходит.

Внимание вопрос, что нужно написать в правила для второго чтобы он как привязанный ходил за первым сервисом?

★★★★

Ответ на: комментарий от yax123

Неправильно написал. Перетестил, так должно работать, по крайней мере на сервисах. Остальное не пробовал. Если разберешься, дай знать, мне тоже тема интересна.

cat s1.service s2.service 
[Unit]
Description=
BindsTo=s2.service

[Service]
ExecStart=echo hello

[Install]
WantedBy=defaults.target
[Unit]
Description=
PartOf=s1.service

[Service]
ExecStart=echo hello2

[Install]
RequiredBy=s1.service

s1 - основной, s2 - зависимый. disable, правда, не работает.

Yorween ()
Последнее исправление: Yorween (всего исправлений: 1)
Ответ на: комментарий от Yorween

То есть мы в s1 (который по идее вообще ни о ком не должен знать) добавляем зависимость от s2 (в том смысле, что сообщаем ему, что от него зависит s2). Решение может быть и рабочее, но оно в корне не верное. Если сервис от кого-то зависит, то это его личное дело, и об этом не нужно знать тому от кого зависят.

yax123 ★★★★ ()

Ну чтож. Как это обычно бывает, хочешь сделать хорошо - делай сам.

Правильное рабочее решение.

unit1:

[Unit]

Description=unit1
TimeoutSec=20
Restart=on-failure
RestartSec=5
[Service]
ExecStart=unit1.app

[Install]
WantedBy=multi-user.target

unit2 (зависит от unit1):

[Unit]
Description=unit2
Requires=unit1
After=unit1
TimeoutSec=20
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
WantedBy=unit1                   <-- здесь задается зависимость от unit1
  1. restart unit1 - приводит к рестарту unit2 (это работает и на исходном случае)

  2. start/stop unit1 - приводит к рестарту unit2 только если есть Install->WantedBy=unit1

  3. killall unit1.app - приводит к рестарту сервиса unit1 через RestartSec. После чего автоматом рестартится unit2.

То что мне и было нужно.

yax123 ★★★★ ()
Ответ на: комментарий от anonymous

Ну так тебе это еще раньше подсказали

без указания секции где размещать WantedBy за подсказку не считается. Это работает только для секции [Install]

yax123 ★★★★ ()
Последнее исправление: yax123 (всего исправлений: 1)
Ответ на: комментарий от yax123

Если тебе это надо еще и разьяснять, то у меня для тебя плохие новости

Ман

Note: WantedBy= and RequiredBy= are used in the [Install] section to create symlinks in .wants/ and .requires/ directories. They cannot be used directly as a unit configuration setting.

anonymous ()