Чи породжували N процесів SystemD N?


13

У моїй організації у нас є ряд чергових процесів, що споживають робітників. Наразі ми використовуємо SupervisorD для управління ними, але хотіли б використовувати SystemD, якщо можливо, для певних переваг. Я досить досвід роботи з написанням користувальницьких одиниць, але не одразу маю аналог у системі SystemD для цього.

У документації SupervisorDnumprocs детально називається параметр, який називається , який дозволяє встановити кількість процесів, які потрібно розпочати з сервісом. Якщо я хочу запустити 30 процесів, це зміна в один рядок.

Чи є в модулях SystemD налаштування, яке дозволить мені вказати, скільки з цих процесів я хотів би почати?


1
Ви намагаєтесь створити кілька примірників одного і того ж підрозділу? Якщо це так, ви можете подивитися 0pointer.de/blog/projects/instance.html
Munir

Відповіді:


31

Те, що згадував Мунір, саме так ви робите. В основному ви створюєте serviceфайл і запускаєте його 30 разів. Тепер це може здатися трохи неприємним, але в нього є переваги, такі як можливість закрити одну з них, якщо вона погано поводиться, і не потрібно закривати їх усіх. Є також деякі речі, які можна зробити для полегшення управління.

Спочатку файл одиниці. Створіть файл, такий як /etc/systemd/system/test@.service. Важливий біт - @символ.

Його вміст може виглядати так:

[Service]
ExecStart=/bin/sleep 600 %I

[Install]
WantedBy=multi-user.target

Потім запустіть його systemctl start test@1.service, systemctl start test@2.service.
Процеси, які запускаються, матимуть такий вигляд:

root     17222  19   0  0.0  0.0 Ss         00:05 /bin/sleep 600 1
root     17233  19   0  0.0  0.0 Ss         00:02 /bin/sleep 600 2

Зауважте, що ви %Iзамінили те, що ви поставили після того, @як ви його почали.

Ви можете почати всі 30 з маленького шлау-фу:

systemctl start test@{1..30}.service

Ви також можете включити їх при завантаженні , як і будь-яка нормальна сервіс: systemctl enable test@1.service.

 

Тепер, що я мав на увазі під дією, яку ви можете зробити, щоб полегшити управління: можливо, вам не потрібно використовувати їх test@{1..30}.serviceдля управління всіма. Це трохи непростий. Натомість можна створити нову ціль для вашої служби.

Створити за /etc/systemd/system/test.targetдопомогою:

[Install]
WantedBy=multi-user.target

Потім відрегулюйте /etc/systemd/system/test@.serviceтак, щоб це виглядало так:

[Unit]
StopWhenUnneeded=true

[Service]
ExecStart=/bin/sleep 600 %I

[Install]
WantedBy=test.target

Перезавантажте системну систему systemctl daemon-reload(потрібна лише в тому випадку, якщо ви змінюєте файл одиниці та не пропускали попередню версію файлу). А тепер увімкніть усі сервіси, якими ви хочете керувати systemctl enable test@{1..30}.service.
(Якщо ви раніше вмикали послугу, поки вона була WantedBy=multi-user.target, відключіть її спочатку, щоб усунути залежність)

Тепер ви можете зробити systemctl start test.targetі systemctl stop test.target, і він буде запускати / зупиняти всі 30 процесів.
І знову ж , ви можете включити при завантаженні , як і будь-який інший файл модуля: systemctl enable test.target.


Дякую за цю детальну відповідь, я шукав це кілька днів.
арнолем

1
Чи знаєте ви, що це відновить процеси, які не спрацьовують?
бастіан

@bastian: можна використовувати Restart=on-failure. Прочитайте сторінку systemd.serviceчоловіка для отримання додаткової інформації.
siride

1

Ось мій приклад використання сценарію python, який працює у virtualenv:

/etc/systemd/system/my-worker@.service

[Unit]
Description=manages my worker service, instance %i
After=multi-user.target

[Service]
PermissionsStartOnly=true
Type=idle
User=root
ExecStart=/usr/local/virtualenvs/bin/python /path/to/my/script.py
Restart=always
TimeoutStartSec=10
RestartSec=10

Вимкнути: sudo systemctl enable my-worker\@{1..30}.service

Увімкнути N працівників: sudo systemctl enable my-worker\@{1..2}.service

Перезавантажити: sudo systemctl daemon-reload

Початок: sudo systemctl start my-worker@2.service

Перевірити статус: sudo systemctl status my-worker@1

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.