Trouver le meilleur Uptime de mes serveurs Linux
L’uptime, c’est quoi ?
L’uptime d’un serveur est le nombre de jours depuis que la machine a été allumée. Il s’obtient tout simplement avec la commande ‘uptime’ sous Linux.
L’uptime, Pourquoi ?
Partant d’une constatation complètement involontaire, on s’est posé la question de savoir lequel de nos serveurs Linux avait le plus grand uptime.
L’uptime, Comment ?
Pour cela, rien de plus simple, une petite ligne en shell s’impose :
Tester la commande avant de la rendre trop complexe
Dans un premier temps, et pour tester ma commande, je me base sur quelques machines prises au hasard dans notre parc : h1 h2 s1r h1c nasr1 wdb nass in2 (ce sont des “abréviations” des noms réels, n’ayez pas peur ;))
Ensuite, je peux tester ma commande depuis mon poste et l’affiner.
Voici la première ébauche de ma commande :
for machine in h1 h2 s1r h1c nasr1 wdb nass in2; do up=`ssh $machine "uptime"`; echo $machine:$up; done
et voici le résultat :
h1: 14:07:56 up 424 days, 3:52, 1 user, load average: 0.32, 0.36, 0.34 h2: 14:07:57 up 220 days, 4:19, 1 user, load average: 0.91, 0.54, 0.38 s1r: 14:07:58 up 220 days, 4:18, 0 users, load average: 2.08, 1.41, 1.31 h1c: 14:07:58 up 281 days, 11:18, 0 users, load average: 0.02, 0.06, 0.04 nasr1: 14:07:59 up 1288 days, 21:35, 0 users, load average: 0.21, 0.38, 0.48 wdb: 14:08:00 up 1400 days, 1:51, 0 users, load average: 0.05, 0.02, 0.00 nass: 14:08:01 up 1626 days, 23:26, 0 users, load average: 0.16, 0.22, 0.19 in2: 14:08:02 up 1637 days, 22:30, 1 user, load average: 0.01, 0.01, 0.00
Pas très lisible à première vue… Nous allons retravailler cela.
Affiner le résultat…
Tout d’abord, avec la commande ‘cut’, je ne vais récupérer que la 4ème valeur du résultat de la commande ‘uptime’. A savoir le nombre de jours Up!
Voici la commande ‘uptime’ avec son ‘cut’ :
for machine in h1 h2 s1r h1c nasr1 wdb nass in2; do up=`ssh $machine "uptime | cut -d ' ' -f4"`; echo $machine $up; done
Le résultat devient plus lisible :
h1 424 h2 220 s1r 220 h1c 281 nasr1 1288 wdb 1400 nass 1626 in2 1637
Trions, c’est dans l’air du temps
Bon, le tri maintenant : Au résultat de ma commande, je vais ajouter le tri avec la commande ‘sort’, sur le 2ème champ (argument ‘-k2’), sur des valeurs numériques (argument ‘-n’), et inverser (argument ‘-r’) le résultat.
for machine in h1 h2 s1r h1c nasr1 wdb nass in2; do up=`ssh $machine "uptime | cut -d ' ' -f4"`; echo $machine $up; done | sort -k2 -n -r
Et voila le résultat trié sur mon échantillon :
in2 1637 nass 1626 wdb 1400 nasr1 1288 h1 424 h1c 281 s1r 220 h2 220
Et grandeur réelle ?
Reste à lancer la commande sur l’ensemble de nos serveurs supervisés (246 serveurs Linux, physiques ou virtuels actuellement). Pour cela, je me base sur mon fichier de ‘config ssh’ avec l’aide d’un ‘grep’ pour n’utiliser que les lignes de déclaration de ‘host’:
Exemple de fichier config ssh:
Host in2 HostName xxx.xxx.xxx.xxx user charles Host nass HostName xxx.xxx.xxx.xxx user charles Host wdb HostName xxx.xxx.xxx.xxx user charles Host nasr1 HostName xxx.xxx.xxx.xxx user charles
Je vais donc “alimenter” le ‘for’ avec le résultat de mon ‘grep’. De plus, j’ajoute en fin de commande, un ‘head’ pour n’avoir que les 10 premières lignes comme résultat de ma commande.
Voici ma commande finale :
for machine in `grep -i 'host ' config`; do up=`ssh $machine "uptime | cut -d ' ' -f4"`; echo $machine $up; done | sort -k2 -n -r | head -n 10
Et voici le résultat :
in2 1637 nass 1626 det1 1626 dol1 1422 nv2 1415 lp2 1415 i1a 1402 i1 1402 fr1 1402 wdb 1400
1637 jours, soit 4 ans et demi, c’est pas trop mal 🙂