systemd: démarrage à la demande de services comme postgresql et mysql qui ne prennent pas encore en charge l'activation par socket

8

Sur mon ordinateur portable, j'utilise MySQL et PostgreSQL uniquement pour les tests. Je n'en ai pas besoin jusqu'à ce que je commence la programmation, ce qui peut prendre des heures après le démarrage. Mais démarrer les services manuellement et taper mon mot de passe sudo est une gêne (mineure).

J'ai lu que systemd ne prend en charge le démarrage des services que lorsque le port de ce service est accessible. Mais une recherche rapide sur Google semble indiquer que l'activation basée sur socket n'est pas encore prise en charge dans PG et MySQL.

Je me rends compte que je peux pirater cela en utilisant des scripts shell ou attendre que les mainteneurs réparent les services, mais je cherche maintenant un meilleur moyen (à des fins éducatives).

La question: Comment puis-je réaliser le démarrage à la demande de ces services d'une manière qui utilise les fonctionnalités de systemd ou est recommandée comme «meilleure pratique» Linux?

Quelques idées:

  • Existe-t-il un service que je peux installer qui gère les services de démarrage et d'arrêt automatiques en fonction des conditions (comme un processus particulier en cours d'exécution)?
  • Existe-t-il un service proxy qui est activé par un socket et lance à son tour le service cible?

systemd 229, Kubuntu 16.04, MySQL 5.7, PostgreSQL 9.5

Mise à jour: la réponse:

Comment j'ai utilisé systemd-socket-proxyd comme suggéré par Siosm:

/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

Recharger / arrêter / démarrer au besoin:

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

Tester:

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
la source

Réponses:

3

l'activation basée sur socket n'est pas encore prise en charge dans PostgreSQL et MySQL.

La question est la réponse. Vous avez déjà trouvé le meilleur moyen, vous l'avez mentionné dans la question, puis vous avez déclaré qu'il n'avait pas été mis en œuvre. Oracle a résolu le problème en disant que l'activation du socket (en réalité, en utilisant des descripteurs de fichiers d'écoute déjà ouverts au lieu d'ouvrir les siens, en ce qui concerne le programme serveur) a été implémentée alors qu'elle ne l'a pas été. MariaDB a un problème encore ouvert. Quant à PostgreSQL, vous êtes dans le même bateau que Christoph Berg en attendant que cela soit implémenté.

Lectures complémentaires

JdeBP
la source
Merci, mais le but de ma question est de comprendre comment y parvenir maintenant, pour de tels services. Je vais clarifier cela dans ma question.
Oleg