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 🙂

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *