Haben SystemD N Prozesse erzeugt?

12

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 numprocsdem 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?

Naftuli Kay
quelle
1
Versuchen Sie, mehrere Instanzen derselben Einheit zu erstellen? In diesem Fall sollten Sie sich 0pointer.de/blog/projects/instances.html
Munir,

Antworten:

30

Was Munir erwähnte, ist genau, wie Sie dies tun. Grundsätzlich erstellen Sie eine serviceDatei 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:

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

[Install]
WantedBy=multi-user.target

Dann starten Sie es mit systemctl start [email protected], systemctl start [email protected].
Die Prozesse, die gestartet werden, sehen folgendermaßen aus:

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

Beachten Sie, dass das Symbol durch das %Iersetzt wurde, was Sie nach dem @Start eingegeben haben.

Sie können alle 30 mit ein wenig Shell-Fu beginnen:

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

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}.servicesie 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.targetmit:

[Install]
WantedBy=multi-user.target

Dann stellen Sie das /etc/systemd/system/[email protected]so ein, dass es so aussieht:

[Unit]
StopWhenUnneeded=true

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

[Install]
WantedBy=test.target

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öchten systemctl 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.targetund ausführen systemctl 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 .

Patrick
quelle
Vielen Dank für diese ausführliche Antwort, ich habe diese für mehrere Tage durchsucht.
Arnolem
1
Wissen Sie, ob dadurch fehlgeschlagene Prozesse neu gestartet werden?
Bastian
@ Bastian: Sie können verwenden Restart=on-failure. Lesen Sie die systemd.serviceManpage für mehr.
Siride
1

Hier ist mein Beispiel mit einem Python-Skript, das in einer virtuellen Umgebung ausgeführt wird:

/etc/systemd/system/[email protected]

[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

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

radtek
quelle