Sélectionner une page

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