systemd: On-Demand-Start von Diensten wie postgresql und mysql, die die Socket-basierte Aktivierung noch nicht unterstützen

8

Auf meinem Laptop verwende ich MySQL und PostgreSQL nur zum Testen. Ich brauche sie erst, wenn ich mit dem Programmieren beginne, möglicherweise Stunden nach dem Start. Das manuelle Starten der Dienste und das Eingeben meines sudo-Passworts ist jedoch (geringfügig) ärgerlich.

Ich habe gelesen, dass systemd das Starten von Diensten nur unterstützt, wenn auf den Port für diesen Dienst zugegriffen wird. Eine schnelle Google-Suche scheint jedoch darauf hinzudeuten, dass die Socket-basierte Aktivierung in PG & MySQL noch nicht unterstützt wird.

Mir ist klar, dass ich dies mithilfe von Shell-Skripten hacken oder warten kann, bis die Betreuer die Dienste repariert haben, aber ich suche jetzt nach einem besseren Weg (für Bildungszwecke).

Die Frage: Wie kann ich einen On-Demand-Start solcher Dienste auf eine Weise erreichen, die entweder systemd-Funktionen nutzt oder als "Best Practice" für Linux empfohlen wird?

Einige Gedanken:

  • Gibt es einen Dienst, den ich installieren kann, der Dienste zum automatischen Starten und automatischen Stoppen basierend auf Bedingungen (z. B. einem bestimmten laufenden Prozess) verwaltet?
  • Gibt es einen Proxy-Dienst, der von einem Socket aktiviert wird und den Zieldienst startet?

systemd 229, Kubuntu 16.04, MySQL 5.7, PostgreSQL 9.5

Update: Die Antwort:

Wie ich systemd-socket-proxyd verwendet habe, wie von Siosm vorgeschlagen:

/etc/mysql/mysql.conf.d/mysqld.cnf

port        = 13306

/etc/systemd/system/proxy-to-mysql.socket

[Socket]
ListenStream=0.0.0.0:3306

[Install]
WantedBy=sockets.target

/etc/systemd/system/proxy-to-mysql.service

[Unit]
Requires=mysql.service
After=mysql.service

[Service]
# note: this path may vary
ExecStart=/lib/systemd/systemd-socket-proxyd 127.0.0.1:13306
PrivateTmp=no
PrivateNetwork=no

Nach Bedarf neu laden / stoppen / starten:

sudo systemctl daemon-reload
sudo systemctl enable proxy-to-mysql.socket
sudo systemctl start proxy-to-mysql.socket
sudo systemctl stop mysql.service  # for testing

Prüfung:

sudo systemctl status proxy-to-mysql.socket # should be ACTIVE
sudo systemctl status proxy-to-mysql # should be INACTIVE
sudo systemctl status mysql # should be INACTIVE
telnet 127.0.0.1 3306
sudo systemctl status proxy-to-mysql # should be ACTIVE
sudo systemctl status mysql # should be ACTIVE
Oleg
quelle

Antworten:

3

Die Socket-basierte Aktivierung wird in PostgreSQL & MySQL noch nicht unterstützt.

Die Frage ist die Antwort. Sie haben bereits den besseren Weg gefunden, ihn in der Frage erwähnt und dann festgestellt, dass er nicht implementiert wurde. Oracle schloss das Problem mit der Aussage, dass die Socket-Aktivierung (tatsächlich unter Verwendung bereits geöffneter Deskriptoren für Überwachungsdateien, anstatt eigene zu öffnen, was das Serverprogramm betrifft) implementiert wurde, wenn dies nicht der Fall war. MariaDB hat ein noch offenes Thema. Bei PostgreSQL sitzen Sie im selben Boot wie Christoph Berg und warten darauf, dass dies implementiert wird.

Weiterführende Literatur

JdeBP
quelle
Vielen Dank, aber der springende Punkt meiner Frage ist, herauszufinden, wie dies jetzt für solche Dienste erreicht werden kann. Ich werde dies in meiner Frage klarstellen.
Oleg