W mojej organizacji mamy wiele kolejek zajmujących procesy robocze. Obecnie używamy SupervisorD do zarządzania nimi, ale chcielibyśmy użyć SystemD, jeśli to możliwe, aby uzyskać pewne korzyści. Mam dość doświadczenie w pisaniu niestandardowych jednostek, ale nie mam od razu analogu w ziemi SystemD.
W dokumentacji SupervisorD nazwany parametr numprocs
jest szczegółowy, co pozwala ustawić liczbę procesów, które chcieliby zostać uruchomione z usługą. Jeśli chcę, aby uruchomiono 30 procesów, jest to zmiana jednowierszowa.
Czy w jednostkach SystemD jest ustawienie, które pozwoli mi określić, ile z tych procesów chciałbym rozpocząć?
systemd
supervisord
Naftuli Kay
źródło
źródło
Odpowiedzi:
Munir wspomniał dokładnie, jak to robisz. Zasadniczo tworzysz
service
plik i uruchamiasz go 30 razy. Teraz może to wydawać się trochę niewygodne, ale ma zalety, takie jak możliwość zamknięcia jednego z nich, jeśli jest źle funkcjonujący, i nie trzeba wyłączać wszystkich. Istnieje również kilka rzeczy, które możesz zrobić, aby ułatwić zarządzanie.Najpierw plik jednostki. Utwórz plik, taki jak
/etc/systemd/system/[email protected]
. Ważnym elementem jest@
symbol.Jego zawartość może wyglądać następująco:
Następnie należy uruchomić go
systemctl start [email protected]
,systemctl start [email protected]
.Uruchomione procesy będą wyglądały następująco:
Zauważ, że
%I
został zastąpiony czymkolwiek, co umieścisz po jego@
uruchomieniu.Możesz zacząć wszystkie 30 od małego shell-fu:
Można także włączyć je w bagażniku jak każdy normalny usługi:
systemctl enable [email protected]
.Co mam na myśli, mówiąc o rzeczach, które możesz zrobić, aby ułatwić zarządzanie: Być może nie chcesz używać wszystkich
test@{1..30}.service
do zarządzania nimi. To jest trochę nieporęczne. Zamiast tego możesz utworzyć nowy cel dla swojej usługi.Utwórz za
/etc/systemd/system/test.target
pomocą:Następnie dostosuj
/etc/systemd/system/[email protected]
tak, aby wyglądało tak:Załaduj ponownie systemd za pomocą
systemctl daemon-reload
(konieczne tylko, jeśli modyfikujesz plik jednostki i nie pomijałeś jego wcześniejszej wersji). A teraz włącz wszystkie usługi, którymi chcesz zarządzaćsystemctl enable test@{1..30}.service
.(Jeśli wcześniej włączyłeś tę usługę
WantedBy=multi-user.target
, wyłącz ją najpierw, aby usunąć zależność)Możesz teraz zrobić
systemctl start test.target
isystemctl stop test.target
, a to uruchomi / zatrzyma wszystkie 30 procesów.I znów, można włączyć przy starcie jak każdy inny plik jednostki:
systemctl enable test.target
.źródło
Restart=on-failure
. Przeczytajsystemd.service
stronę podręcznika, aby uzyskać więcej.Oto mój przykład przy użyciu skryptu python działającego w virtualenv:
/etc/systemd/system/[email protected]
Wyłączyć:
sudo systemctl enable my-worker\@{1..30}.service
Włącz N pracowników:
sudo systemctl enable my-worker\@{1..2}.service
Przeładować:
sudo systemctl daemon-reload
Początek:
sudo systemctl start [email protected]
Sprawdź status:
sudo systemctl status my-worker@1
źródło