BG Development


  Reply to this topicStart new topicStart Poll

> systemd, Създаване на service и target
relax4o
Публикувано на: 08-08-2023, 08:40
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2730
Регистриран на: 04.04.07



Здравейте,

Имам следният казус: създал съм един консуматор на съобщения (брокера е RabbitMQ), които изпълнявам чрез Симфони команда. Тези консуматори ще се изпълняват дълготрайно и изпълнението им трябва да става автоматично.

За целта съм създал systemd unit файл, който е темплейтен unit в случай, че на по-късен етап искам да стартирам по няколко инстанции на един и същ консуматор.

Дотук всичко добре, но също създадох и target файл, който да обхваща всички workers за този консуматор, за да мога лесно да ги управлявам на куп.

Като допълнение обаче съм създал и още един target файл, който пък ще обхваща всички target файлове за отделните консуматори, които ще дойдат по-късно, и с който ще искам да стартирам абсолютно всички workers.

Йерархията, към която се целя е следната

CODE

all.workers.target
● └─consumer1.workers.target
●   ├─consumer1.worker@1.service
●   ├─consumer1.worker@2.service
● └─consumer2.workers.target
●   ├─consumer2.worker@1.service


А файловете изглеждат по следния начин

all.workers.target - този таргет реално е enabled, за да може при reboot да стартира всички под него.
CODE

[Unit]
Description="All Workers"
After=network-online.target

Wants=consumer1.workers.target
# Wants=consumer2.workers.target
# и т.н.

[Install]
WantedBy=multi-user.target


consumer1.workers.target
CODE

[Unit]
Description="Consumer 1 Workers"
After=network-online.target
PartOf=all.workers.target

Wants=consumer1.worker@1.service
# Wants=consumer1.worker@2.service
# и т.н.

[Install]
WantedBy=all.workers.target


consumer1.worker@.service
CODE

[Unit]
Description="Consumer Worker #%i"
After=network-online.target
PartOf=consumer1.workers.target

[Service]
Type=simple
User=user
ExecStart=<command>
Restart=always
RestartSec=10

# stop trying to restart the service if it crashes 5 times within 60 seconds
StartLimitInterval=60
StartLimitBurst=5

[Install]
WantedBy=consumer1.workers.target


Когато увеличавам Wants директивите, за да добавям нови инстанции всичко е наред, но когато реша да премахна инстанция и не става. Таргетите все още стартират предходния брой инстанции и не мога да ги махна.

Някакви предложения как да го постигна?

Предложиха ми вариант да си напиша един бърз bash скрипт, на който да подавам брой инстанции и да ги стартира за мен. Така темплейтния unit като съдържа PartOf директивата все още ще държи инстанциите в правилната йерархия и когато искам да намаля или увелича инстанциите, това би трябвало да рефлектира правилно.

Най-вероятно ще мина на него вариант, но се чудя защо systemd отказва да премахва инстанции, когато вече не са опиасни в Wants директива. А и съм отворен на други предложения освен bash скрипт.


--------------------
Бисери :D

QUOTE (oveRLuckEd)
Ползваш някоя нова версия на PHP, която е вече ооп ориентирана и заради това ти я изкарва тази грешка.


QUOTE (nbacool2)
Щом няма input полета, значи няма откъде да се направи SQL инжекция Very Happy
PM
Top
relax4o
Публикувано на: 08-08-2023, 10:08
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2730
Регистриран на: 04.04.07



Оказа се, че за да изчистя (след промяна на някоя от конфигурациите) трябва да имам следната последователност:

CODE

systemctl stop all.workers.target

# качи (и подмени) файловете с новите промени

systemctl daemon-reload
systemctl reset-failed # това ми липсваше, за да изчисти всичко спряно
systemctl start all.workers.target


Това мнение е било редактирано от relax4o на 08-08-2023, 10:13


--------------------
Бисери :D

QUOTE (oveRLuckEd)
Ползваш някоя нова версия на PHP, която е вече ооп ориентирана и заради това ти я изкарва тази грешка.


QUOTE (nbacool2)
Щом няма input полета, значи няма откъде да се направи SQL инжекция Very Happy
PM
Top
SuN
Публикувано на: 27-08-2023, 14:52
Quote Post


Group Icon
Име:
Група: Администратор
Ранг: Почетен член

Мнения: 12473
Регистриран на: 27.01.05



Тъкмо си играх да пусна едно скриптче като услуга от обикновен потребител и забелязах, че никъде в примерите не ползваш "disable":

QUOTE
Когато увеличавам Wants директивите, за да добавям нови инстанции всичко е наред, но когато реша да премахна инстанция и не става. Таргетите все още стартират предходния брой инстанции и не мога да ги махна.


Когато ползвам "systemctl disable some.service", от директорията с целите (стойността на WantBy) се премахва връзката към тази услуга и systemd няма да се пробва да я стартира.

Може да пробваш дали и това е решение на проблема.


--------------------
Само аз не троля.
Всички коментари са плод на художествена измислица и нямат общо с действителни и недействителни лица, събития и факти.
PMEmail Poster
Top
relax4o
Публикувано на: 27-08-2023, 17:46
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 2730
Регистриран на: 04.04.07



QUOTE (SuN @ 27-08-2023, 14:52)
Тъкмо си играх да пусна едно скриптче като услуга от обикновен потребител и забелязах, че никъде в примерите не ползваш "disable":

QUOTE
Когато увеличавам Wants директивите, за да добавям нови инстанции всичко е наред, но когато реша да премахна инстанция и не става. Таргетите все още стартират предходния брой инстанции и не мога да ги махна.


Когато ползвам "systemctl disable some.service", от директорията с целите (стойността на WantBy) се премахва връзката към тази услуга и systemd няма да се пробва да я стартира.

Може да пробваш дали и това е решение на проблема.

Бях пробвал, според предложение от тема в стака или редит не помня, но при такъв тип инстанции (от темплейт) нямаше разлика, защото системд очевидно знае само за темплейтния сървиз без броя стартирани инстанции от него (така предполагам).

За това си реших проблема, който написах във второто си мнение. Спирам всичко и ресетвам всичко, което се счита за фейл и след това стартирам новия брой.

В реалното ми решение дори задавам шаблон, за името на сървизите, на reset-failed, за да не пипам всичко, а само това, което ми трябва за конкретния случай.


--------------------
Бисери :D

QUOTE (oveRLuckEd)
Ползваш някоя нова версия на PHP, която е вече ооп ориентирана и заради това ти я изкарва тази грешка.


QUOTE (nbacool2)
Щом няма input полета, значи няма откъде да се направи SQL инжекция Very Happy
PM
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0