Tous les services qui tournent sous Linux, tous les programmes que nous utilisons, font appel à de nombreuses librairies, au nom en .so, (Sous Windows on appelle cela des DLL). Par exemple /lib/x86_64-linux-gnu/libpcre.so.3
est une librairie de lecture d’expressions rationnelles
Par exemple, si je prends un binaire de base, mettons bash, LE shell, je peux savoir de quelles librairies il dépend :
mamachine:~ ldd /bin/bash linux-vdso.so.1 => (0x00007fffe3138000) libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fbb2e02c000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fbb2de28000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fbb2da9b000) /lib64/ld-linux-x86-64.so.2 (0x00007fbb2e26b000)
La commande ldd nous permet donc de savoir non seulement ces librairies, mais aussi si certaines manquent, empêchant le lancement de ce programme.
Conséquence de cette utilisation massive de librairies, si nous mettons à jour, par exemple le package Debian libtinfo5, il faudra redémarrer tous les binaires bash tournant en permanence pour que la nouvelle version de cette librairie soit utilisée partout.
C’est là qu’intervient le package debian-goodies, que je vous recommande d’installer sur toutes vos instances de Debian. Ce package contient entre autre un programme nommé checkrestart, qui permet de vérifier quels services utilisent des librairies mises à jour depuis le lancement du service, et qu’il faudrait donc redémarrer pour prendre en compte ces mises à jour.
Exemple de sortie (raccourcie) de checkrestart :
mamachine:~ checkrestart Found 57 processes using old versions of upgraded files (18 distinct programs) (17 distinct packages) Of these, 9 seem to contain init scripts which can be used to restart them: The following packages seem to have init scripts that could be used to restart them: bind9: 14804 /usr/sbin/named openssh-server: 12963 /usr/sbin/sshd opendkim: 19439 /usr/sbin/opendkim nagios-nrpe-server: 14045 /usr/sbin/nrpe These are the init scripts: service bind9 restart service ssh restart service opendkim restart service nagios-nrpe-server restart These processes do not seem to have an associated init script to restart them: perl-base: 5307 /usr/bin/perl
On remarque que checkrestart cherche les binaires ayant besoin d’un reboot, regarde leur package Debian, et cherche les scripts d’init permettant de redémarrer ces services.
Pour certains d’entre eux, il n’est pas aussi facile de déterminer le service. Ainsi le process au PID 5307 est un script perl, aussi le binaire est perl, même s’il s’agit d’un autre service. ps nous permet d’en savoir plus :
mamachine:~ ps auxw|grep 5307 root 5307 0.0 0.0 49000 9048 ? Ss janv.18 0:45 munin-node
On devine que ce programme est en fait le serveur munin, que l’on peut redémarrer via service munin-node restart
Du code Octopuce
En tant qu’administrateur systèmes de centaines de serveurs, cette commande est donc extrêmement pratique mais manque un peu d’automatismes et d’intelligence. Aussi avons-nous produit notre propre version de checkrestart qui connait mieux les process spéciaux (en perl, python, php, bash etc.) Et qui propose de redémarrer lui-même les services concernés.
À ce jour, ce script connait les services lancés par login, prosody (en lua), amavis, munin-node, sympa (en perl), mailman (en python), dovecot imapd (qui reboote mal), mysqld (que checkrestart ne sait pas analyser) ainsi que fail2ban (qui fait tourner un script python et un gam_server pour la détection des fichiers logs modifiés)
Vous pouvez tout à fait ajouter vos propres cas (c’est du bash) pour gérer vos spécificités serveur individuelles
Le code de checkrestart.octopuce est téléchargeable ici
Note: tous les codes de nos scripts pour administrateurs système sont publiés sous licence CC0 dans un dépôt git public. Retrouvez-les sur notre compte GitHub
Image copyright Official U.S. Navy | CC BY 2.0