In meiner Organisation gibt es eine Reihe von Arbeitsprozessen, die die Warteschlange beanspruchen. Wir verwenden derzeit SupervisorD, um sie zu verwalten, möchten jedoch SystemD verwenden, wenn dies für bestimmte Vorteile möglich ist. Ich bin ziemlich erfahren mit dem Schreiben von benutzerdefinierten Einheiten, aber ich habe nicht sofort ein Analog in SystemD Land dafür.
In der SupervisorD-Dokumentation ist ein Parameter aufgeführt, mit numprocs
dem festgelegt werden kann, wie viele Prozesse mit dem Service gestartet werden sollen. Wenn 30 Prozesse gestartet werden sollen, handelt es sich um eine einzeilige Änderung.
Gibt es eine Einstellung in SystemD-Einheiten, mit der ich angeben kann, wie viele dieser Prozesse ich gestartet haben möchte?
quelle
Antworten:
Was Munir erwähnte, ist genau, wie Sie dies tun. Grundsätzlich erstellen Sie eine
service
Datei und starten sie 30 Mal. Das mag ein wenig unangenehm erscheinen, hat aber Vorteile, z. B. die Möglichkeit, einen von ihnen herunterzufahren, wenn er sich schlecht benimmt, und nicht alle herunterzufahren. Es gibt auch einige Dinge, die Sie tun können, um die Verwaltung zu vereinfachen.Zunächst die Unit-Datei. Erstellen Sie eine Datei, z
/etc/systemd/system/[email protected]
. Das wichtige Bit ist das@
Symbol.Der Inhalt könnte folgendermaßen aussehen:
Dann starten Sie es mit
systemctl start [email protected]
,systemctl start [email protected]
.Die Prozesse, die gestartet werden, sehen folgendermaßen aus:
Beachten Sie, dass das Symbol durch das
%I
ersetzt wurde, was Sie nach dem@
Start eingegeben haben.Sie können alle 30 mit ein wenig Shell-Fu beginnen:
Sie können sie auch beim Booten wie jeder normalen Dienst aktivieren:
systemctl enable [email protected]
.Nun, was ich mit Dingen gemeint habe, die Sie tun können, um das Management zu vereinfachen: Vielleicht möchten Sie nicht, dass Sie
test@{1..30}.service
sie alle verwalten müssen. Es ist etwas unhandlich. Sie können stattdessen ein neues Ziel für Ihren Dienst erstellen.Erstellen
/etc/systemd/system/test.target
mit:Dann stellen Sie das
/etc/systemd/system/[email protected]
so ein, dass es so aussieht:System neu laden mit
systemctl daemon-reload
(nur erforderlich, wenn Sie die Unit-Datei ändern und die frühere Version nicht übersprungen haben). Aktivieren Sie jetzt alle Dienste, die Sie verwalten möchtensystemctl enable test@{1..30}.service
.(Wenn Sie den Dienst zuvor aktiviert hatten
WantedBy=multi-user.target
, deaktivieren Sie ihn zuerst, um die Abhängigkeit zu beseitigen.)Sie können jetzt
systemctl start test.target
und ausführensystemctl stop test.target
, und alle 30 Prozesse werden gestartet / gestoppt.Und wieder können Sie beim Booten wie jede andere Unit-Datei aktivieren:
systemctl enable test.target
.quelle
Restart=on-failure
. Lesen Sie diesystemd.service
Manpage für mehr.Hier ist mein Beispiel mit einem Python-Skript, das in einer virtuellen Umgebung ausgeführt wird:
/etc/systemd/system/[email protected]
Deaktivieren:
sudo systemctl enable my-worker\@{1..30}.service
N-Worker aktivieren:
sudo systemctl enable my-worker\@{1..2}.service
Neu laden:
sudo systemctl daemon-reload
Start:
sudo systemctl start [email protected]
Status überprüfen:
sudo systemctl status my-worker@1
quelle