Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Unit templates =3a comment systemd r=c3=a9cup=c3=a8re le nom des instances =c3=a0 d=c3=a9marrer =3f

12 réponses
Avatar
Francois Lafont
Bonjour à tous,

J'ai une question sur systemd et, plus précisément, sur les templates
d'unités systemd. Je donne un exemple avec ma Ubuntu 18.04 perso où j'ai
ceci :

------------------------------------
~$ sudo service postgresql@10-main status
● postgresql@10-main.service - PostgreSQL Cluster 10-main
Loaded: loaded (/lib/systemd/system/postgresql@.service; indirect; vendor preset: enabled)
Active: active (running) since Sat 2018-12-01 11:36:51 CET; 38min ago
Process: 1184 ExecStart=/usr/bin/pg_ctlcluster --skip-systemctl-redirect 10-main start (code=exited, status=0/SUCCESS)
Main PID: 1274 (postgres)
Tasks: 7 (limit: 4915)
CGroup: /system.slice/system-postgresql.slice/postgresql@10-main.service
├─1274 /usr/lib/postgresql/10/bin/postgres -D /var/lib/postgresql/10/main -c config_file=/etc/postgresql/10/main/postgresql.conf
├─1292 postgres: 10/main: checkpointer process
├─1293 postgres: 10/main: writer process
├─1294 postgres: 10/main: wal writer process
├─1295 postgres: 10/main: autovacuum launcher process
├─1296 postgres: 10/main: stats collector process
└─1297 postgres: 10/main: bgworker: logical replication launcher

Dec 01 11:36:49 flhpz4 systemd[1]: Starting PostgreSQL Cluster 10-main...
Dec 01 11:36:51 flhpz4 systemd[1]: Started PostgreSQL Cluster 10-main.
------------------------------------

J'ai donc le fichier /lib/systemd/system/postgresql@.service qui est un unit
template, ie une unité systemd qui pourra se décliner en plusieurs instances.
Et dans mon cas j'ai l'instance "postgresql@10-main" qui tourne automatiquement
au boot où :

- "10" est la version de PostGreSQL sur ma Ubuntu,
- "main" est le nom du clusteur PostGreSQL.

L'idée, si j'ai bien compris, est qu'avec une même unité systemd, on peut alors
lancer plusieurs daemons (par exemple je pourrais avoir plusieurs versions de
PostgreSQL qui tournent sur ma machine, ou alors une seule version mais plusieurs
clusters PostgreSQL qui tournent etc).

Voici le contenu de mon unit template /lib/systemd/system/postgresql@.service :

------------------------------------
$ cat /lib/systemd/system/postgresql@.service
# systemd service template for PostgreSQL clusters. The actual instances will
# be called "postgresql@version-cluster", e.g. "postgresql@9.3-main". The
# variable %i expands to "version-cluster", %I expands to "version/cluster".
# (%I breaks for cluster names containing dashes.)

[Unit]
Description=PostgreSQL Cluster %i
ConditionPathExists=/etc/postgresql/%I/postgresql.conf
PartOf=postgresql.service
ReloadPropagatedFrom=postgresql.service
Before=postgresql.service

[Service]
Type=forking
# -: ignore startup failure (recovery might take arbitrarily long)
# the actual pg_ctl timeout is configured in pg_ctl.conf
ExecStart=-/usr/bin/pg_ctlcluster --skip-systemctl-redirect %i start
# 0 is the same as infinity, but "infinity" needs systemd 229
TimeoutStartSec=0
ExecStop=/usr/bin/pg_ctlcluster --skip-systemctl-redirect -m fast %i stop
TimeoutStopSec=1h
ExecReload=/usr/bin/pg_ctlcluster --skip-systemctl-redirect %i reload
PIDFile=/var/run/postgresql/%i.pid
SyslogIdentifier=postgresql@%i
# prevent OOM killer from choosing the postmaster (individual backends will
# reset the score to 0)
OOMScoreAdjust=-900
# restarting automatically will prevent "pg_ctlcluster ... stop" from working,
# so we disable it here. Also, the postmaster will restart by itself on most
# problems anyway, so it is questionable if one wants to enable external
# automatic restarts.
#Restart=on-failure
# (This should make pg_ctlcluster stop work, but doesn't:)
#RestartPreventExitStatus=SIGINT SIGTERM

[Install]
WantedBy=multi-user.target
------------------------------------

Dans le cas de mon instance "postgresql@10-main" automatiquement démarrée
au boot, dans le template ci-dessus :

- le "%i" a été remplacé par "10-main"
- le "%I" a été remplacé par "10/main"

On imagine bien que le "10/main" trouve son origine au niveau de
l'arborescence de mon système où j'ai les répertoires suivants :
- /etc/postgresql/10/main/
- /var/lib/postgresql/10/main/.


Maintenant voici ma question

Au moment du boot, l'instance "10/main" est démarrée automatiquement par
systemd mais quel mécanisme précisément permet de faire en sorte que c'est
bien l'instance "10/main" qui est démarrée pas une autre ? En d'autres termes,
j'ai un template mais il faut bien un programme, un code shell etc. pour
alimenter ce template avec des valeurs (pour que les %i, %I etc. se remplissent).
Donc il doit bien y avoir quelque part une configuration, un code shell ou je
ne sais quoi pour dire à systemd « c'est l'instance "10/main" de postgresql@.service
que tu dois lancer automatiquement au boot ». Mais je n'arrive pas à trouver sur
ma machine où cela est mis en place. Pouvez-vous me dire où ?

J'espère que c'est à peu près clair.
Merci d'avance pour votre aide.

--
François Lafont

2 réponses

1 2
Avatar
Francois Lafont
On 12/4/18 11:22 PM, Christophe PEREZ wrote:
Alors Doug713705 et Christophe... convaincus ?


Oh l'autre, comment il a viré mon smiley dans sa citation ! :p
Ce n'est pas pour rien que je n'ai pas choisi une distribution comme
celles que vous avez quasiment tous. Je veux pouvoir profiter des
versions très récentes des softs, tout en n'ayant pas à subir des choix
(systemd) qui ne me conviendraient pas. Avec gentoo, je fais comme JE
veux et très peu de choses me sont imposées.
Convaincu ?

Oui, si Gentoo avec Openrc te conviennent alors moi ça me va tout à fait.
--
François Lafont
Avatar
Christophe PEREZ
Le Tue, 04 Dec 2018 23:47:00 +0100, Francois Lafont a écrit :
Oh l'autre, comment il a viré mon smiley dans sa citation ! :p

Du tout. Ça doit être Pan qui l'a viré.
1 2