Ausführen mehrerer Dienste mit unterschiedlichen Argumenten

Ausführen mehrerer Dienste mit unterschiedlichen Argumenten

Ich habe ein Python-Skript erstellt, um einige Daten zu verarbeiten, die ich als Dienst ausführen möchte. Das Skript verarbeitet die Daten und schläft dann eine Weile, um neue Daten zu verarbeiten, die eingegangen sind.

Mein Problem besteht darin, dass ich mehrere Instanzen des Dienstes ausführen möchte, da ich einige unterschiedliche Datenquellen verarbeiten möchte und mein Skript darauf ausgelegt ist, jeweils nur eine Datenquelle zu verarbeiten.

Ich sehe ein paar verschiedene Möglichkeiten, dies zu tun:

Ich könnte das Skript umschreiben, um alle Datenquellen zu verarbeiten. Dadurch wird es für die Ad-hoc-Verwendung unbrauchbar und die Aktualisierung des Datenquellensatzes wird schwieriger, da hinzugefügte oder entfernte Quellen nicht automatisch erkannt werden können. Obwohl dies möglich ist, ist dies meine am wenigsten bevorzugte Option.

Ich könnte ein Wrapper-Skript in Bash oder Python erstellen, das Skripte für die Datenquellen startet, die ich verarbeiten möchte. Das fühlt sich auch etwas umständlich an.

Ich könnte für jede Datenquelle eine Unit-Datei erstellen, die jeweils das Verarbeitungsskript mit den entsprechenden Argumenten aufruft. Dadurch erhalte ich eine Reihe von Systemdateien, z. B. processing_ds1.system, processing_ds2.system usw. Für mich ist das ein möglicher Weg, es sei denn, es gibt gute Gründe, es nicht zu tun.

Ich würde es vorziehen, eine Systemdatei zu erstellen, die entweder mit Argumenten für jede Datenquelle aufgerufen werden kann oder alle Instanzen innerhalb der Systemdatei startet.

Ich habe also zwei Alternativen:

Wie ist es möglich, Argumente mit Unit-Dateien zu verwenden? Ich habe gesehen, dass PostgreSQL verschiedene Versionen mit @ starten kann, d. h.

systemctl start postgres@12-main

um den Cluster 12-main zu starten. Aber wie geht das? Ich kann keine führende Unit-Datei für PostgreSQL finden.

Oder

Ist es möglich und ratsam, mehrere Dienste von einer Unit-Datei aus zu starten?

Antwort1

Sie können eine Vorlagen-Unit-Datei verwenden:systemd.unit

Für OpenVPN als Beispiel: Sie können eine Unit-Datei mit einem Namen [email protected]und /etc/systemd/systemfolgendem Inhalt erstellen:

[Unit]
Description=OpenVPN connection to %i
After=network-online.target
Wants=network-online.target

[Service]
Type=forking
ExecStart=/usr/sbin/openvpn --config /etc/openvpn/%i.conf
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

Bei jedem Ausführen systemctl start openvpn@myconfig ersetzt systemd %i in der Unit-Datei durch „myconfig“. Sie führen also /usr/sbin/openvpn --config /etc/openvpn/myconfig.conf aus.

verwandte Informationen