Momentane Situation
Ich betreibe einen Linux-Server (Arch). Ich habe eine Serveranwendung, die wie folgt ausgeführt wird:
run_server filename --port=xxxx
Ich habe systemd-Servicedateien geschrieben. Jede davon hält einen Prozess für eine bestimmte Datei auf einem bestimmten Port am Leben. Wenn ich eine neue Datei bereitstellen möchte, kopiere ich die systemd-Servicedatei, bearbeite sie, weise ihr einen neuen Port zu und aktiviere/starte den neuen Dienst.
Dies ist viel Handarbeit, da die Dateien oft von einem Team von Personen hinzugefügt und entfernt werden.
Anfrage
Wenn ich ein Verzeichnis mit Dateien habe
directory/firstfile
directory/secondfile
....
Ich möchte für jede Datei einen einzelnen Prozess am Leben erhalten:
run_server firstfile --port=9001
run_server secondfile --port=9002
...
Wenn eine Datei aus dem Verzeichnis entfernt wird, sollte der Prozess gestoppt werden. Wenn eine Datei zum Verzeichnis hinzugefügt wird, sollte ein neuer Prozess gestartet werden.
Wie kann ich das erreichen?
Antwort1
Okay, ich habe mich für eine Kombination der Ratschläge der beiden Kommentatoren entschieden.
Eine Unit-Datei mit Systemd-Vorlagen wurde erstellt ( )
/etc/systemd/system/[email protected]
[Service] Type=simple ExecStart=/../run_server %i ...
Erstellen Sie einen systemd-Pfaddienst (
/etc/systemd/system/sync_server_units.path
), der das Verzeichnis überwacht[Path] PathModified=/path/to/directory ...
Damit wird () gestartet
/etc/systemd/system/sync_server_units.service
, ein einfaches run_once:[Service] Type=oneshot ExecStart=/../sync_server_units
Schließlich habe ich ein Skript (
sync_server_units
), das den Inhalt des Verzeichnisses mit der Ausgabe von vergleichtsystemctl list-units --all 'run_server@*'
und den auf der Vorlage basierenden Dienst nach Bedarf aktiviert/startet/stoppt/deaktiviert.
Funktioniert bisher gut!