Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

9.2. Gérer les services système

Note

Afin de gagner en expertise, vous serez sans doute intéressé par le cours de formation Red Hat System Administration II (RH134).
Les versions précédentes de Red Hat Enterprise Linux, qui étaient distribuées avec SysV init ou Upstart, utilisaient des scripts init (« init scripts ») situés dans le répertoire /etc/rc.d/init.d/. Ces scripts init étaient habituellement écrits en Bash, et autorisaient l'administrateur systèmes à contrôler l'état des services et des démons dans leurs systèmes. Sur Red Hat Enterprise Linux 7, ces scripts init ont été remplacés par des unités de service (« service units »).
Les unités de service se terminent par l'extension de fichier .service et ont un but similaire à celui des scripts init. Pour afficher, lancer, arrêter, redémarrer, activer ou désactiver des services système, veuillez utiliser la commande systemctl décrite dans Tableau 9.3, « Comparaison du service Utility avec systemctl », Tableau 9.4, « Comparaison de l'utilitaire chkconfig avec systemctl », et un peu plus bas dans cette section. Les commandes service et chkconfig sont toujours disponibles dans le système et fonctionnent comme prévu, mais sont uniquement incluses pour des raisons de compatibilité et doivent être évitées.

Tableau 9.3. Comparaison du service Utility avec systemctl

servicesystemctlDescription
service nom start
systemctl start nom.service
Lance un service.
service nom stop
systemctl stop nom.service
Arrête un service.
service nom restart
systemctl restart nom.service
Redémarre un service.
service nom condrestart
systemctl try-restart nom.service
Redémarre un service uniquement s'il est en cours d'exécution.
service nom reload
systemctl reload nom.service
Recharge la configuration.
service nomstatus
systemctl status nom.service
systemctl is-active nom.service
Vérifie si un service est en cours d'exécution.
service --status-all
systemctl list-units --type service --all
Affiche le statut de tous les services.

Tableau 9.4. Comparaison de l'utilitaire chkconfig avec systemctl

chkconfigsystemctlDescription
chkconfig nom on
systemctl enable nom.service
Active un service.
chkconfig nom off
systemctl disable nom.service
Désactive un service.
chkconfig --list nom
systemctl status nom.service
systemctl is-enabled nom.service
Vérifie si un service est activé.
chkconfig --list
systemctl list-unit-files --type service
Répertorie tous les services et vérifie s'ils sont activés.
chkconfig --list
systemctl list-dependencies --after
Répertorie les services qui doivent démarrer avant l'unité spécifiée.
chkconfig --list
systemctl list-dependencies --before
Répertorie les services qui doivent démarrer aprés l'unité spécifiée.

Spécifier les unités de service

Par souci de clarté, tous les exemples de commande dans le reste de cette section utilisent des noms d'unité complets avec l'extension de fichier .service. Exemple :
~]# systemctl stop nfs-server.service
Cependant, il est possible d'omettre cette extension de fichier, dans lequel cas, l'utilitaire systemctl assume que l'argument suppose qu'il s'agit d'une unité de service. La commande suivante équivaut à celle se trouvant ci-dessus :
~]# systemctl stop nfs-server
De plus, certaines unités ont des alias correspondants. Ces noms peuvent avoir des noms plus courts que les unités, qui peuvent être utilisés à la place des noms d'unité. Pour trouver les alias pouvant être utilisés pour une unité particulière :
~]# systemctl show nfs-server.service -p Names

9.2.1. Répertorier les services

Pour répertorier toutes les unités de service actuellement chargées, veuillez saisir ce qui suit dans une invite de shell :
systemctl list-units --type service
Cette commande affiche le nom complet de chaque fichier d'unités de service (UNIT) suivi d'une note indiquant si le ficiers d'unités a été chargée (LOAD), son état d'activation de haut niveau (ACTIVE) et de bas niveau (SUB), ainsi qu'une courte description (DESCRIPTION).
Par défaut, la commande systemctl list-units affiche uniquement les unités actives. Si vous souhaitez afficher toutes les unités chargées, quel que soit leur état, veuillez exécuter cette commande avec l'option de ligne de commande --all ou -a :
systemctl list-units --type service --all
Vous pouvez également répertorier toutes les unités de service disponibles pour voir si elles sont activées. Pour faire cela, veuillez saisir :
systemctl list-unit-files --type service
Cette commande affiche le nom complet de chaque unité de service (UNIT FILE) suivi d'informations indiquant si l'unité de service est activée ou non (STATE). Pour obtenir des informations sur la manière de déterminer le statut des unités de service individuelles, veuillez consulter la Section 9.2.2, « Afficher le statut du service ».

Exemple 9.1. Répertorier les services

Pour répertorier toutes les unités de service actuellement chargées, veuillez exécuter la commande suivante :
~]$ systemctl list-units --type service
UNIT                           LOAD   ACTIVE SUB     DESCRIPTION
abrt-ccpp.service              loaded active exited  Install ABRT coredump hook
abrt-oops.service              loaded active running ABRT kernel log watcher
abrt-vmcore.service            loaded active exited  Harvest vmcores for ABRT
abrt-xorg.service              loaded active running ABRT Xorg log watcher
abrtd.service                  loaded active running ABRT Automated Bug Reporting Tool
...
systemd-vconsole-setup.service loaded active exited  Setup Virtual Console
tog-pegasus.service            loaded active running OpenPegasus CIM Server

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

46 loaded units listed. Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'
Pour répertorier tous les fichiers d'unités de service installées afin de déterminer si elles sont activées, veuillez saisir :
~]$ systemctl list-unit-files --type service
UNIT FILE                                   STATE
abrt-ccpp.service                           enabled
abrt-oops.service                           enabled
abrt-vmcore.service                         enabled
abrt-xorg.service                           enabled
abrtd.service                               enabled
...
wpa_supplicant.service                      disabled
ypbind.service                              disabled

208 unit files listed.

9.2.2. Afficher le statut du service

Pour afficher des informations détaillées sur une unité de service qui correspond à un service système, veuillez saisir ce qui suit dans une invite de shell :
systemctl status name.service
Veuillez remplacer name par le nom de l'unité de service que vous souhaitez inspecter (par exemple, gdm). Cette commande affiche le nom de l'unité de service sélectionnée suivi d'une courte description, un ou plusieurs champs décrit dans la Tableau 9.5, « Informations sur les unités de service disponibles », et si elle est exécutée par l'utilisateur root, les entrées de journal les plus récentes seront également incluses.

Tableau 9.5. Informations sur les unités de service disponibles

ChampDescription
LoadedInformations indiquant si l'unité de service est chargée, le chemin absolu vers le fichier de l'unité, et une note indiquant si l'unité est activée.
ActiveInformations indiquant si l'unité de service exécutée est suivie d'un horodatage.
Main PIDLe PID du service système correspondant est suivi par son nom.
StatusInformations supplémentaires sur le service système correspondant.
ProcessInformations supplémentaires sur les processus connexes.
CGroupInformations supplémentaires sur les Groupes de contrôle connexes (cgroups).
Pour vérifier qu'une unité de service particulière est en cours d'exécution, veuillez exécuter la commande suivante :
systemctl is-active name.service
Similairement, pour déterminer si une unité de service particulière est activée, veuillez saisir :
systemctl is-enabled name.service
Remarquez que systemctl is-active et systemctl is-enabled retournent un statut de sortie (« exit status ») de 0 si l'unité de service spécifiée est en cours d'exécution ou si elle est activée. Pour obtenir des informations sur la manière de répertorier toutes les unités de service actuellement chargées, veuillez consulter la Section 9.2.1, « Répertorier les services ».

Exemple 9.2. Afficher le statut du service

L'unité de service du gestionnaire d'affichage GNOME se nomme gdm.service. Pour déterminer le statut actuel de cette unité de service, veuillez saisir ce qui suit dans une invite de shell :
~]# systemctl status gdm.service
gdm.service - GNOME Display Manager
   Loaded: loaded (/usr/lib/systemd/system/gdm.service; enabled)
   Active: active (running) since Thu 2013-10-17 17:31:23 CEST; 5min ago
 Main PID: 1029 (gdm)
   CGroup: /system.slice/gdm.service
           ├─1029 /usr/sbin/gdm
           ├─1037 /usr/libexec/gdm-simple-slave --display-id /org/gno...
           └─1047 /usr/bin/Xorg :0 -background none -verbose -auth /r...

Oct 17 17:31:23 localhost systemd[1]: Started GNOME Display Manager.

Exemple 9.3. Pour afficher les services qui doivent démarrer avant un service.

Pour déterminer quels services doivent démarrer avant le service indiqué, saisir ce qui suit dans une invite de shell :
~]# systemctl list-dependencies --after gdm.service
gdm.service
├─dbus.socket
├─getty@tty1.service
├─livesys.service
├─plymouth-quit.service
├─system.slice
├─systemd-journald.socket
├─systemd-user-sessions.service
└─basic.target[sortie tronquée]

Exemple 9.4. Pour afficher les services qui doivent démarrer après un service.

Pour déterminer quels services doivent démarrer après le service indiqué, saisir ce qui suit dans une invite de shell :
~]# systemctl list-dependencies --before gdm.service
gdm.service
├─dracut-shutdown.service
├─graphical.target
│ ├─systemd-readahead-done.service
│ ├─systemd-readahead-done.timer
│ └─systemd-update-utmp-runlevel.service
└─shutdown.target
  ├─systemd-reboot.service
  └─final.target
    └─systemd-reboot.service

9.2.3. Lancer un service

Pour lancer une unité de service qui correspond à un service système, veuillez saisir ce qui suit dans une invite de shell en tant qu'utilisateur root :
systemctl start name.service
Veuillez remplacer name par le nom de l'unité de service que vous souhaitez lancer (par exemple, gdm). Cette commande lance l'unité de service sélectionnée dans la session actuelle. Pour obtenir des informations sur la manière d'activer une unité de service pour qu'elle soit lancée pendant l'initialisation, veuillez consulter la Section 9.2.6, « Activer un service ». Pour obtenir des informations sur la façon de déterminer le statut d'une unité de service particulière, veuillez consulter la Section 9.2.2, « Afficher le statut du service ».

Exemple 9.5. Lancer un service

L'unité de service pour le serveur HTTP Apache est nommé httpd.service. Pour activer cette unité de service et lancer le démon httpd dans la session actuelle, veuillez exécuter la commande suivante en tant qu'utilisateur root :
~]# systemctl start httpd.service

9.2.4. Arrêter un service

Pour arrêter une unité de service qui correspond à un service système, veuillez saisir ce qui suit dans une invite de shell en tant qu'utilisateur root :
systemctl stop name.service
Veuillez remplacer name par le nom de l'unité de service que vous souhaitez arrêter (par exemple, bluetooth). Cette commande arrête l'unité de service sélectionnée dans la session actuelle. Pour obtenir des informations sur la manière de désactiver une unité de service pour l'empêcher d'être lancée pendant l'initialisation, veuillez consulter la Section 9.2.7, « Désactiver un service ». Pour obtenir des informations sur comment déterminer le statut d'une unité de service particulière, veuillez consulter la Section 9.2.2, « Afficher le statut du service ».

Exemple 9.6. Arrêter un service

L'unité de service du démon bluetoothd est nommée bluetooth.service. Pour désactiver cette unité de service et arrêter le démon bluetoothd dans la session actuelle, veuillez exécuter la commande suivante en tant qu'utilisateur root :
~]# systemctl stop bluetooth.service

9.2.5. Redémarrer un service

Pour redémarrer une unité de service qui correspond à un service système, veuillez saisir ce qui suit dans une invite de shell en tant qu'utilisateur root :
systemctl restart name.service
Veuillez remplacer name par le nom de l'unité de service que vous souhaitez redémarrer (par exemple, httpd). Cette commande arrête l'unité de service sélectionnée dans la session actuelle et la redémarre immédiatement. De manière plus importante, si l'unité de service n'est pas en cours d'exécution, cette commande la lancera également. Pour ordonner à Systemd de redémarrer une unité de service uniquement si le service correspondant est déjà en cours d'exécution, veuillez exécuter la commande suivante en tant qu'utilisateur root :
systemctl try-restart name.service
Certains services système permettent de recharger leur configuration sans interrompre leur exécution. Pour faire cela, en tant qu'utilisateur root, veuillez saisir :
systemctl reload name.service
Remarquez que les services système qui ne prennent pas en charge cette fonctionnalité ignoreront simplement cette commande. Pour plus de commodité, la commande systemctl prend également en charge les commandes reload-or-restart et reload-or-try-restart qui redémarrent de tels services. Pour obtenir des informations sur la manière de déterminer le statut d'une certaine unité de service, veuillez consulter la Section 9.2.2, « Afficher le statut du service ».

Exemple 9.7. Redémarrer un service

Pour empêcher les utilisateurs de rencontrer des messages d'erreur non nécessaires ou des pages web dont le rendu est partiel, le serveur HTTP Apache vous permet de modifier et de recharger sa configuration sans avoir à le redémarrer et à interrompre les requêtes activement traitées. Pour cela, veuillez saisir ce qui suit dans une invite de shell en tant qu'utilisateur root :
~]# systemctl reload httpd.service

9.2.6. Activer un service

Pour configurer une unité de service qui correspond à un service système afin qu'elle soit automatiquement lancée pendant l'initialisation, veuillez saisir ce qui suit dans une invite de shell en tant qu'utilisateur root :
systemctl enable name.service
Veuillez remplacer name par le nom de l'unité de service que vous souhaitez activer (par exemple, httpd). Cette commande lit la section [Install] de l'unité de service sélectionnée et crée les liens symboliques appropriés vers le fichier /usr/lib/systemd/system/name.service dans le répertoire /etc/systemd/system/ et ses sous-répertoires. Cependant, cette commande ne réécrit pas les liens qui existent déjà. Si vous souhaitez vous assurer que les liens symboliques soient créés à nouveau, veuillez exécuter la commande suivante en tant qu'utilisateur root :
systemctl reenable name.service
Cette commande désactive l'unité de service sélectionnée et la réactive immédiatement. Pour obtenir des informations sur la manière de déterminer si une unité de service particulière est autorisée à se lancer pendant l'initialisation, veuillez consulter la Section 9.2.2, « Afficher le statut du service ». Pour obtenir des informations sur la manière de lancer un service dans la session actuelle, veuillez consulter la Section 9.2.3, « Lancer un service ».

Exemple 9.8. Activer un service

Pour configurer le serveur HTTP Apache de manière à ce qu'il puisse être lancé automatiquement pendant l'initialisation, veuillez utiliser la commande suivante en tant qu'utilisateur root :
~]# systemctl enable httpd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

9.2.7. Désactiver un service

Pour empêcher une unité de service qui correspond à un service système d'être automatiquement lancée pendant l'initialisation, veuillez saisir ce qui suit dans une invite de shell en tant qu'utilisateur root :
systemctl disable name.service
Veuillez remplacer name par le nom de l'unité de service que vous souhaitez désactiver (par exemple, bluetooth). Cette commande lit la section [Install] de l'unité de service sélectionnée et supprime les liens symboliques appropriés pointant vers le fichier /usr/lib/systemd/system/name.service du répertoire /etc/systemd/system/ et de ses sous-répertoires. En outre, vous pouvez masquer toute unité de service pour l'empêcher d'être lancée manuellement ou par un autre service. Pour faire cela, veuillez exécuter la commande suivante en tant qu'utilisateur root :
systemctl mask name.service
Cette commande remplace le fichier /etc/systemd/system/name.service par un lien symbolique pointant vers /dev/null, ce qui rend le fichier de l'unité inaccessible à Systemd. Pour inverser cette action et démasquer une unité de service, veuillez saisir en tant qu'utilisateur root :
systemctl unmask name.service
Pour obtenir des informations sur la manière de déterminer si une unité de service particulière est autorisée à être lancée en cours d'initialisation, veuillez consulter la Section 9.2.2, « Afficher le statut du service ». Pour obtenir des informations sur la manière d'arrêter un service dans la session actuelle, veuillez consulter la Section 9.2.4, « Arrêter un service ».

Exemple 9.9. Désactiver un service

L'Exemple 9.6, « Arrêter un service » illustre comment arrêter l'unité bluetooth.service dans la session actuelle. Pour empêcher cette unité de service d'être lancée pendant l'initialisation, veuillez saisir ce qui suit dans une invite de shell en tant qu'utilisateur root :
~]# systemctl disable bluetooth.service
Removed symlink /etc/systemd/system/bluetooth.target.wants/bluetooth.service.
Removed symlink /etc/systemd/system/dbus-org.bluez.service.