Services, services, services. Un service est une partie importante de l'informatique. Vous lisez cet article sur un service. Votre ordinateur exécute des services. Internet en est rempli.
À propos de systemctl
Sous Linux, la méthode standard d'exécution et de gestion des services consiste à utiliser l'utilitaire systemd et la commande systemctl
. Son utilisation est assez simple :il vous suffit de connaître le nom du service que vous souhaitez gérer, puis vous pouvez utiliser cette commande pour démarrer ou arrêter le service, vérifier son état ou effectuer d'autres fonctions :
# systemctl start httpd
# systemctl stop httpd
# systemctl status httpd
Fichiers d'unité
Un service est défini dans un fichier appelé fichier unité. Ils se trouvent généralement dans le répertoire /usr/lib/systemd/system
. Voici un exemple de liste :
# ls /usr/lib/systemd/system
auditd.service multi-user.target sys-kernel-debug.mount
[email protected] multi-user.target.wants sys-kernel-tracing.mount
basic.target NetworkManager-dispatcher.service syslog.socket
basic.target.wants NetworkManager.service syslog.target.wants
blk-availability.service NetworkManager-wait-online.service
Parfois, vous devez exécuter plusieurs instances d'un service sur un même hôte. Par exemple, si vous gérez des sites Web pour plusieurs clients, les réglementations en matière de sécurité exigent que chaque client dispose de sa propre instance individuelle. Cela signifie que vous devez exécuter un nouveau service HTTP Apache pour chacun, mais avoir beaucoup de services peut être difficile à gérer. Si vous avez 10 clients différents, vous devrez créer 10 fichiers unitaires distincts pour les gérer. Heureusement, il existe un meilleur moyen de gérer plusieurs instances d'un service.
Le symbole @
Notez que certains fichiers d'unité ont un symbole @ dans leur nom. Ce symbole a une signification intéressante. En fait, après avoir installé Apache HTTP Server, vous remarquerez peut-être plusieurs fichiers d'unité de service, dont un qui a le symbole @ dans son nom—[email protected]
.
Je vais vous montrer comment cela peut faciliter un peu la vie d'un administrateur système, en utilisant le serveur HTTP Apache pour cet exemple :
# dnf -y install httpd
# cd /usr/lib/systemd/system
# ls -d http*
httpd.service [email protected] httpd.service.d httpd.socket httpd.socket.d
Le symbole @ indique qu'une substitution sera effectuée. Systemd prendra tout ce que vous tapez après et remplacera la variable %i
à l'intérieur du fichier d'unité de service. La variable peut être vue dans cet extrait du [email protected]
fichier :
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:[email protected](8)
[Service]
Type=notify
Environment=LANG=C
Environment=HTTPD_INSTANCE=%i
ExecStartPre=/bin/mkdir -m 710 -p /run/httpd/instance-%i
ExecStartPre=/bin/chown root.apache /run/httpd/instance-%i
ExecStartPre=/bin/mkdir -m 700 -p /var/lib/httpd/instance-%i
ExecStartPre=/bin/chown apache.apache /var/lib/httpd/instance-%i
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND -f conf/%i.conf
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful -f conf/%i.conf
Notez que le fichier d'unité httpd par défaut, httpd.service
, n'a pas le symbole @ dans son nom et semble différent. Il est utilisé pour une seule instance de base par défaut du serveur HTTP Apache.
Exécuter plusieurs instances
En savoir plus sur les administrateurs système
- Activer le blog Sysadmin
- L'entreprise automatisée :un guide pour gérer l'informatique avec l'automatisation
- Livre électronique :Automatisation Ansible pour les administrateurs système
- Témoignages du terrain :guide de l'administrateur système sur l'automatisation informatique
- eBook :Un guide de Kubernetes pour les SRE et les administrateurs système
- Derniers articles sur l'administrateur système
Pour exécuter plusieurs instances à l'aide de ce fichier d'unité spécial, chacune a besoin d'un nom unique. Supposons que vous ayez deux clients, La Petite Banque et La Grande Banque. Nommez les instances littlebank et bigbank. Pour en gérer un, ajoutez simplement son nom après le symbole @. Démarrez chaque instance avec la commande appropriée :
- littlebank :
systemctl start httpd@littlebank
- bigbank :
systemctl start httpd@bigbank
Gardez à l'esprit que la plupart des services nécessitent certaines configurations pour éviter les conflits entre différentes instances. Je ne les couvrirai pas tous ici, mais Apache a besoin de plusieurs éléments, notamment des numéros de port d'écoute uniques, des fichiers PID et des racines de document.
Je vais démontrer en essayant de démarrer l'instance littlebank. Je m'attends à ce qu'il échoue, mais il fournira un message d'état utile :
# systemctl start httpd@littlebank
# systemctl status httpd@littlebank
● [email protected] - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/[email protected]; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Tue 2020-11-10 11:41:20 EST; 1min 58s ago
Docs: man:[email protected](8)
Process: 2205 ExecStartPre=/bin/mkdir -m 710 -p /run/httpd/instance-littlebank (code=exited, status=0/SUCCESS)
Process: 2207 ExecStartPre=/bin/chown root.apache /run/httpd/instance-littlebank (code=exited, status=0/SUCCESS)
Process: 2208 ExecStartPre=/bin/mkdir -m 700 -p /var/lib/httpd/instance-littlebank (code=exited, status=0/SUCCESS)
Process: 2209 ExecStartPre=/bin/chown apache.apache /var/lib/httpd/instance-littlebank (code=exited, status=0/SUCCESS)
Process: 2210 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND -f conf/littlebank.conf (code=exited, status=1/FAILURE)
Main PID: 2210 (code=exited, status=1/FAILURE)
CPU: 26ms
Nov 10 11:41:20 localhost.localdomain systemd[1]: Starting The Apache HTTP Server...
Nov 10 11:41:20 localhost.localdomain httpd[2210]: httpd: Could not open configuration file /etc/httpd/conf/littlebank.conf>
Nov 10 11:41:20 localhost.localdomain systemd[1]: [email protected]: Main process exited, code=exited, status=1/FAIL>
Nov 10 11:41:20 localhost.localdomain systemd[1]: [email protected]: Failed with result 'exit-code'.
Nov 10 11:41:20 localhost.localdomain systemd[1]: Failed to start The Apache HTTP Server.
Vous pouvez voir que systemd remplace correctement le nom de l'instance à la place du %i
variable dans le fichier unité. Cependant, Apache ne démarre pas car il n'a pas pu ouvrir un fichier de configuration. Donc, maintenant je vais configurer les instances pour inclure la création des fichiers de configuration nécessaires (littlebank.conf
et bigbank.conf
) dans /etc/httpd/conf/
:
# ls /etc/httpd/conf
bigbank.conf httpd.conf littlebank.conf
Vous pouvez maintenant gérer chaque instance avec systemctl
. Émettre start
et status
commandes à chacun. J'ai raccourci la sortie aux détails les plus pertinents :
# systemctl start httpd@bigbank
# systemctl start httpd@littlebank
# systemctl status httpd@bigbank
● [email protected] - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/[email protected]; disabled; vendor preset: disabled)
Active: active (running) since Tue 2020-11-10 12:26:06 EST; 56min ago
# systemctl status httpd@littlebank
● [email protected] - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/[email protected]; disabled; vendor preset: disabled)
Active: active (running) since Tue 2020-11-10 12:25:58 EST; 55min ago
Voici la vue de processus de ces instances. Il y en a plus d'un car Apache bifurque les processus serveur, ce qu'il fait normalement :
# pgrep -a httpd
2834 /usr/sbin/httpd -DFOREGROUND -f conf/littlebank.conf
2835 /usr/sbin/httpd -DFOREGROUND -f conf/littlebank.conf
2836 /usr/sbin/httpd -DFOREGROUND -f conf/littlebank.conf
3061 /usr/sbin/httpd -DFOREGROUND -f conf/bigbank.conf
3062 /usr/sbin/httpd -DFOREGROUND -f conf/bigbank.conf
3064 /usr/sbin/httpd -DFOREGROUND -f conf/bigbank.conf
Mettez-le en pratique
Cette petite fonctionnalité systemd est très utile lorsque vous avez besoin de plusieurs instances d'un service. J'espère que vous pourrez en faire bon usage dans votre travail.