GNU/Linux >> Tutoriels Linux >  >> Linux

Gérer plusieurs instances de service avec systemctl

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.


Linux
  1. Comment utiliser la commande Systemctl pour gérer les services Systemd

  2. Exécuter de véritables instances de processus multiples de Gnome-terminal ?

  3. Commandes de service de base

  4. Utiliser Systemctl pour gérer les services

  5. systemctl :commande introuvable

Installer plusieurs instances Drupal avec Nginx sur Ubuntu 20.04

Commandes Systemctl pour gérer le service Systemd

Comment gérer plusieurs versions de Java avec jEnv sous Linux

Gestion des cgroups avec systemd

Premiers pas avec systemctl

Comment utiliser systemctl sous Linux